原文链接:来自公众号生信数据挖掘
该文只简单的讲解关于的R的随机森林具体实现步骤,只简单介绍了随机森林,未对原理进行过多解释
随机森林模型是一种预测能力较强的数据挖掘模型,常用于进行分类预测和数据回归分析,这里我们只讨论分类预测。
使用的数据集是R自带的 iris 的数据集 如上图所示, 随机森林模型包含多个树形分类器,预测结果由多个分类器(决策树)投票得出,每个决策树相当于一个大师,通过自己在数据集中学到的知识对于新的数据进行分类。
在随机森林算法的函数randomForest()中有两个非常重要的参数,而这两个参数又将影响模型的准确性,它们分别是mtry和ntree。一般对mtry的选择是逐一尝试,直到找到比较理想的值,ntree的选择可通过图形大致判断模型内误差稳定时的值。
randomForest::randomForest 该包中主要涉及5个重要函数,关于这5个函数的语法和参数请见下方:
randomForest(): 此函数用于构建随机森林模型
randomForest(formula, data=NULL, …, subset,na.action=na.fail)
formula:指定模型的公式形式,类似于y~x1+x2+x3…;data:指定分析的数据集;.ntree:指定随机森林所包含的决策树数目,默认为500;mtry:指定节点中用于二叉树的变量个数,默认情况下数据集变量个数的二次方根(分类模型)或三分之一(预测模型)。一般是需要进行人为的逐次挑选,确定最佳的m值;如何选择最优的特征个数m,要解决这个问题,我们主要依据计算得到的袋外错误率. 在构建每棵树时,对训练集使用了不同的bootstrap sample(随机且有放回地抽取)。所以对于每棵树而言,部分训练实例没有参与这棵树的生成,它们称为第k棵树的oob样本
袋外错误率(oob error)计算方式如下:
对每个样本计算它作为oob样本的树对它的分类情况以简单多数投票作为该样本的分类结果最后用误分个数占样本总数的比率作为随机森林的oob误分率在R语言中,我们调用randomForest包中的randomForest()函数来实现随机森林算法。
遍历比较确定最优mtry值。mtry参数是随机森林建模中,构建决策树分支时随机抽样的变量个数。选择合适的mtry参数值可以降低随机森林模型的预测错误率。示例的数据中共有4个自变量,可通过遍历设定mtry参数1至4进行4次建模,并打印出每次建模的错误率,选择错误率最低的mytry取值。
- 选择最优mtry参数值
n <- ncol(iris) -1 errRate <- c(1) for (i in 1:n){ m <- randomForest(Species~.,data=iris,mtry=i,proximity=TRUE) err<-mean(m$err.rate) errRate[i] <- err } print(errRate) [1] 0.05462878 0.04320072 0.04302654 0.04316091#选择平均误差最小的m m= which.min(errRate) print(m)输出结果:[1] 3 根据遍历打印结果,当mtry=3时,错误率达到最低,因此本次建模过程中以3作为mtry参数值 选择合适的ntree参数值: ntree参数指出建模时决策树的数量。ntree值设置过低会导制错误率偏高,ntree值过高会提升模型复杂度,降低效率。以mtry=3进行随机森林建模,并将模型错误率与决策树数量的关系可视化,如下:
- 选择最优ntree参数值
rf_ntree <- randomForest(Species~.,data=iris) plot(rf_ntree)结果图如下: 从图中可以看到,当ntree=100时,模型内的误差就基本稳定了,出于更保险的考虑,我们确定ntree值为100。
根据以上结果,以mtry=3,mtree=100为参数建立随机森林模型,并打印模型信息
m <- randomForest(Species~.,data=traindata,mtry=3, ntree=100, proximity=TRUE) print(m)结果如下所示:
Call: randomForest(formula = Species ~ ., data = traindata, mtry = 3, ntree = 100, proximity = TRUE) Type of random forest: classification Number of trees: 100No. of variables tried at each split: 3 OOB estimate of error rate: 5.41% Confusion matrix: setosa versicolor virginica class.error setosa 39 0 0 0.00000000 versicolor 0 33 3 0.08333333 virginica 0 3 33 0.08333333 MDSplot():函数用于实现随机森林的可视化 specialmds <- cmdscale(1 - m$proximity, eig=TRUE) op <- par(pty="s") pdf("trees_proximity.pdf") pairs(cbind(traindata[,1:length(traindata)-1], specialmds$points), cex=0.6, gap=0,col=c("red", "green", "blue")[as.numeric(traindata$Species)], main=":Predictors and MDS of Proximity Based on RandomForest") par(op) print(specialmds$GOF) dev.off() importance()函数:用于计算模型变量的重要性 importance(m)结果:
MeanDecreaseGini Sepal.Length 1.201101 Sepal.Width 1.685455 Petal.Length 32.926760 Petal.Width 37.559478绘制重要性图示:
varImpPlot(m)从返回的数据和图形可知,在四个变量中,Petal.Width和Petal.Length最为重要,其次分别是Sepal.Length和Sepal.Width.
- 接着使用已建立好的随机森林模型进行新数据集的测试
pred <- predict(m,newdata=testdata)