分类分析--随机森林
随机森林(random forest)是一种组成式的有监督学习方法。在随机森林中,我们同时生成多个预测模型,并将模型的结果汇总以提升分类准确率。随机森林的算法涉及对样本单元和变量进行抽样,从而生成大量决策树。对每个样本单元来说,所有决策树依次对其进行分类。所有决策树预测类别中的众数类别即为随机森林所预测的这一样本单元的类别。
假设训练集中共有N个样本单元,M个变量,则随机森林算法如下。
(1) 从训练集中随机有放回地抽取N个样本单元,生成大量决策树。
(2) 在每一个节点随机抽取m<M个变量,将其作为分割该节点的候选变量。每一个节点处的变量数应一致。
(3) 完整生成所有决策树,无需剪枝(最小节点为1)。
(4) 终端节点的所属类别由节点对应的众数类别决定。
(5) 对于新的观测点,用所有的树对其进行分类,其类别由多数决定原则生成。
生成树时没有用到的样本点所对应的类别可由生成的树估计,与其真实类别比较即可得到袋外预测(out-of-bag,OOB)误差。
1 基于传统决策树生成随机森林
randomForest包中的randomForest()函数可用于生成随机森林。函数默认生成500棵树,并且默认在每个节点处抽取sqrt(M)个变量,最小节点为1。如下代码给出了用随机森林算法对乳腺癌数据预测恶性类的代码和结果。
(1)随机森林
library(randomForest)
set.seed(1234)
fit.forest <- randomForest(class~., data=df.train, na.action=na.roughfix, importance=TRUE)
#生成随机森林,na.action=na.roughfix参数可将数值变量中的缺失值替换成对应列的中位数,类别变量中的缺失值替换成对应列的众数类(若有多个众数则随机选一个)。随机森林可度量变量重要性,通过设置information=TRUE参数得到。
fit.forest
结果分析:randomForest()函数从训练集中有放回地随机抽取489个观测点,在每棵树的每个节点随机抽取3个变量,从而生成了500棵传统决策树。
importance(fit.forest, type=2) #给出变量重要性
结果分析:由type=2参数得到的变量相对重要性就是分割该变量时节点不纯度(异质性)的下降总量对所有树取平均。节点不纯度由Gini系数定义。结果显示,sizeUniformity是最重要的变量,mitosis是最不重要的变量。
forest.pred <- predict(fit.forest, df.validate)
#predict()函数用来对对训练集外样本点分类
forest.perf1 <- table(df.validate$class, forest.pred,dnn=c("Actual", "Predicted"))
#生成实际类别与预测类别的交叉表
forest.perf1
结果分析:整体来看,验证集中的准确率达到了(128+68)/210=93%
2 基于条件推断树的随机森林
randomForest包根据传统决策树生成随机森林,而party包中的cforest()函数则可基于条件推断树生成随机森林。当预测变量间高度相关时,基于条件推断树的随机森林可能效果更好。
library(party)
set.seed(1234)
fit.forest <- cforest(class~., data=df.train) #生成森林
fit.forest
forest.pred <- predict(fit.forest, df.validate) #对训练集外的样本分类
forest.perf2 <- table(df.validate$class, forest.pred,dnn=c("Actual", "Predicted"))
forest.perf2
结果分析:整体来看,验证集中的准确率达到了(131+71)/210=96%