第九篇:随机森林(Random Forest)
前言
随机森林非常像《机器学习实践》里面提到过的那个AdaBoost算法,但区别在于它没有迭代,还有就是森林里的树长度不限制。
因为它是没有迭代过程的,不像AdaBoost那样需要迭代,不断更新每个样本以及子分类器的权重。因此模型相对简单点,不容易出现过拟合。
下面先来讲讲它的具体框架流程。
框架流程
随机森林可以理解为Cart树森林,它是由多个Cart树分类器构成的集成学习模式。其中每个Cart树可以理解为一个议员,它从样本集里面随机有放回的抽取一部分进行训练,这样,多个树分类器就构成了一个训练模型矩阵,可以理解为形成了一个议会吧。
然后将要分类的样本带入这一个个树分类器,然后以少数服从多数的原则,表决出这个样本的最终分类类型。
设有N个样本,M个变量(维度)个数,该算法具体流程如下:
1. 确定一个值m,它用来表示每个树分类器选取多少个变量。(注意这也是随机的体现之一)
2. 从数据集中有放回的抽取 k 个样本集,用它们创建 k 个树分类器。另外还伴随生成了 k 个袋外数据,用来后面做检测。
3. 输入待分类样本之后,每个树分类器都会对它进行分类,然后所有分类器按照少数服从多数原则,确定分类结果。
性能制约
1. 森林中的每个树越茂盛,分类效果就越好。
2. 树和树的枝叶穿插越多,分类效果就越差。
重要参数
1. 预选变量个数 (即框架流程中的m);
2. 随机森林中树的个数。
这两个参数的调优非常关键,尤其是在做分类或回归的时候。
构建随机森林模型
函数名:randomForest(......);
函数重要参数说明:
- x,y参数自然是特征矩阵和标签向量;
- na.action:是否忽略有缺失值的样本;
- ntree:树分类器的个数。500-1000为佳;
- mtry:分枝的变量选择数;
- importance:是否计算各个变量在模型中的重要性(后面会提到)。
构建好模型之后,带入predict函数和待预测数据集就可得出预测结果。然而,R语言中对随机森林这个机制的支持远远不止简单的做分类这么简单。它还提供以下这几个功能,在使用这些功能之前,都要先调用randomForest函数架构出模型。
使用随机森林进行变量筛选
之前的文章提到过使用主成分分析法PCA,以及因子分析EFA,但是这两种方法都有各自的缺点。它们都是属于变量组合技术,会形成新的变量,之后一般还需要一个解释的阶段。
对于一些解释起来比较麻烦,以及情况不是很复杂的情况,直接使用随机森林进行特征选择就可以了,下面为具体步骤:
执行这个脚本后:
其中的两列是衡量变量重要性的指标,越高表示该变量对分类的影响越大。第一列是根据精度平均减少值作为标准度量,而第二列则是采用节点不纯度的平均减少值作为度量标准。
重要度的计量方法参考下图(摘自百度文库):
使用随机森林绘制MDS二维图
通过MDS图我们能大致看出哪些类是比较容易搞混的:
生成下图:
可以看出,第二列第三列存在着容易混淆的情况。
小结
R语言包中提供的随机森林功能包还有很多,对于调优很有帮助,请务必查询相关资料并掌握。
另外,部分变种的随机森林算法还可以用来做回归。