原文链接:来自公众号生信数据挖掘
目录
- R实现随机森林
- 随机森林R包
- 估值过程
- 袋外错误率(oob error)
- R randomForest函数实现
- 安装程序包,查看样本数据结构
- 建模与观察
R实现随机森林
-
该文只简单的讲解关于的R的随机森林具体实现步骤,只简单介绍了随机森林,未对原理进行过多解释
-
随机森林模型是一种预测能力较强的数据挖掘模型,常用于进行分类预测和数据回归分析,这里我们只讨论分类预测。
-
使用的数据集是R自带的 iris 的数据集
如上图所示, 随机森林模型包含多个树形分类器,预测结果由多个分类器(决策树)投票得出,每个决策树相当于一个大师,通过自己在数据集中学到的知识对于新的数据进行分类。在随机森林算法的函数randomForest()中有两个非常重要的参数,而这两个参数又将影响模型的准确性,它们分别是mtry和ntree。一般对mtry的选择是逐一尝试,直到找到比较理想的值,ntree的选择可通过图形大致判断模型内误差稳定时的值。
随机森林R包
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值,即随机产生m个变量用于节点上的二叉树,m的选择原则是使错误率最低。
- 应用bootstrap自助法在原数据集中又放回地抽取k个样本集,组成k棵决策树,每个决策树输出一个结果。
- 对k个决策树组成的随机森林对样本进行分类或预测:分类原则:少数服从多数;预测原则:简单平均。
袋外错误率(oob error)
如何选择最优的特征个数m,要解决这个问题,我们主要依据计算得到的袋外错误率.
在构建每棵树时,对训练集使用了不同的bootstrap sample(随机且有放回地抽取)。所以对于每棵树而言,部分训练实例没有参与这棵树的生成,它们称为第k棵树的oob样本
袋外错误率(oob error)计算方式如下:
- 对每个样本计算它作为oob样本的树对它的分类情况
- 以简单多数投票作为该样本的分类结果
- 最后用误分个数占样本总数的比率作为随机森林的oob误分率
R randomForest函数实现
在R语言中,我们调用randomForest包中的randomForest()函数来实现随机森林算法。
安装程序包,查看样本数据结构
#R package# install.packages("randomForest")library(randomForest)#选取训练样本(70%)和测试样本(30%)index <- sample(2,nrow(iris),replace = TRUE,prob=c(0.7,0.3))traindata <- iris[index==1,]testdata <- iris[index==2,]
遍历比较确定最优mtry值。mtry参数是随机森林建模中,构建决策树分支时随机抽样的变量个数。选择合适的mtry参数值可以降低随机森林模型的预测错误率。示例的数据中共有4个自变量,可通过遍历设定mtry参数1至4进行4次建模,并打印出每次建模的错误率,选择错误率最低的mytry取值。
- 选择最优mtry参数值
n <- ncol(iris) -1errRate <- 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: classificationNumber of trees: 100No. of variables tried at each split: 3OOB estimate of error rate: 5.41%Confusion matrix:setosa versicolor virginica class.errorsetosa 39 0 0 0.00000000versicolor 0 33 3 0.08333333virginica 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)
结果:
MeanDecreaseGiniSepal.Length 1.201101Sepal.Width 1.685455Petal.Length 32.926760Petal.Width 37.559478
绘制重要性图示:
varImpPlot(m)
从返回的数据和图形可知,在四个变量中,Petal.Width和Petal.Length最为重要,其次分别是Sepal.Length和Sepal.Width.
- 接着使用已建立好的随机森林模型进行新数据集的测试
pred <- predict(m,newdata=testdata)