《R语言实战》第二版碎碎念之八:随机森林

随机森林(random forest)是一种组成式的有监督学习方法。随机森林的算法涉及对样本单元和变量进行抽样,从而生成大量决策树。对每个样本单元来说,所有决策树依次对其进行分类。所有决策树预测类别中的众数类别即为随机森林所预测的这一样本单元的类别。假设训练集中共有N个样本单元, M个变量。

1) 从训练集中随机有放回地抽取N个样本单元,生成大量决策树。

2) 在每一个节点随机抽取m<M个变量,将其作为分割该节点的候选变量。每一个节点处的变量数应一致。

3) 完整生成所有决策树,无需剪枝(最小节点为1)。

4) 终端节点的所属类别由节点对应的众数类别决定。

5) 对于新的观测点,用所有的树对其进行分类,其类别由多数决定原则生成。

生成树时没有用到的样本点所对应的类别可由生成的树估计,与其真实类别比较即可得到袋外预测(out-of-bag, OOB)误差。无法获得验证集时,这是随机森林的一大优势。randomForest包中的randomForest()函数根据传统决策树生成随机森林。函数默认生成500棵树,并且默认在每个节点处抽取sqrt(M)个变量,最小节点为1。

library(randomForest)

randomForest()函数从训练集中有放回地随机抽取489个观测点,在每棵树的每个节点随机抽取3个变量,从而生成了500棵传统决策树

na.action=na.roughfix参数可将数值变量中的缺失值替换成对应列的中位数,类别变量中的缺失值替换成对应列的众数类(若有多个众数则随机选一个)。

随机森林可度量变量重要性,通过设置information=TRUE参数得到,并通过importance()函数输出

fit.forest <- randomForest(class~.,data=df.train,na.action=na.roughfix,importance=TRUE)

fit.forest

由type=2参数得到的变量相对重要性就是分割该变量时节点不纯度(异质性)的下降总量对所有树取平均。节点不纯度由Gini系数定义。本例中, 数值大的是最重要的变量, 小的是最不重要的变量。

importance(fit.forest,type=2)

forest.pred <- predict(fit.forest,df.validate)

forest.perf <- table(df.validate$class,forest.pred,dnn=c("Actual","Predicted"))

forest.perf

party包中的cforest()函数则可基于条件推断树生成随机森林。当预测变量间高度相关时,基于条件推断树的随机森林可能效果更好。

library(party)

dtree.cforest <- cforest(class~.,data=df.train)

dtree.cfpred <- predict(dtree.cforest,df.validate,type="response")

dtree.cfperf <- table(df.validate$class,dtree.cfpred,dnn=c("Actual","Predicted"))

dtree.cfperf

相较于其他分类方法,随机森林的分类准确率通常更高。另外,随机森林算法可处理大规模问题(即多样本单元、多变量),可处理训练集中有大量缺失值的数据,也可应对变量远多于样本单元的数据。可计算袋外预测误差(OOB error) 、度量变量重要性也是随机森林的两个明显优势。随机森林的一个明显缺点是分类方法(此例中相当于500棵决策树)较难理解和表达。另外,需要存储整个随机森林以对样本单元分类。

此外还可以计算各变量在分类中的重要性:

Importance(fit.forest,type=1)  #重要性评分

Importance(fit.forest, type=2) #Gini指数

变量重要性可视化:

varImpPlot(fit.forest)  #可视化

发表评论

电子邮件地址不会被公开。 必填项已用*标注