随机森林算法
在之前的博客中我们已经介绍过了集成方法中的一大类Boosting方法,这里我们就来介绍另一类的Bagging方法,以及其的一个著名实例随机森领算法。
Bagging算法
Boosting算法使得不同的基学习器具有较大差异的做法是改变训练数据的权重。另一种做法是对训练数据进行采样,产生出若干不同的子集,再从每一个训练子集中训练出一个基学习器。这样,由于训练数据的不同,获得的基学习器可望具有较大的差异。然而,为了获得好的集成,我们同时还希望个体学习器不能太差,如果采样出的每个子集都完全不同,则每个基学习器只用到了一小部分训练数据,这样显然无法确保产生出比较好的基学习器。
为了解决这个问题,我们可以考虑使用相互有交叠的采样子集。可以使用bootstrap采样方法(这在我的博客中有介绍),这是一种有放回的采样方法,初始训练集中约有63.2%的样本出现在采样子集中。
照这样,我们可以采样出T个含m个样本的训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。这就是Bagging的基本流程。在对预测输出进行结合时,Bagging通常对分类任务使用简单投票算法(这个我们稍后会介绍),对分类任务使用简单平均法。
由于T个基学习器互相不关联,因此可以同时学习。考虑到投票/平均过程的复杂度很小,而T通常是一个不太大的常数。因此,训练一个Bagging集成与直接使用基学习算法训练一个学习算法的复杂度同阶。这说明Bagging是一个很高效的集成学习算法。
与标准AdaBoost只适用与二分类任务不同,Bagging能不经修改地用于多分类、回归任务中。
Bagging主要关注降低方差,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显。
随机森林算法
随机森林是在以决策树为基学习器构建集成的基础之上,进一步在训练的过程中加入了随机属性选择。
对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,然后从这个属性子集中选择一个最优属性进行分类。这里的k值控制了随机性的引入程度,推荐值是 k=log2d ,其中d是属性集合的大小。
虽然随机森林算法简单,但它的效果取足以与SVM这种非常复杂的算法相媲美。可以看出,随机森林只是在Bagging的框架上做出了小改动,但是与Bagging中基学习器的『多样性』仅通过样本扰动而来不同,随机森林中基学习器的多样性还来自属性扰动。而且在训练效率上也优于Bagging,因为在选择最优划分属性时只考虑了部分属性。
结合策略
在集成方法中,如何将基学习器的输出结合起来得到集成的输出,就是这一节需要讨论的问题。
平均法
这是针对数值型输出而言的。
简单平均法:
加权平均:
加权平均法的权重一般是从训练数据中学习而得的(这里并没有说明如何学习到这个权重),现实任务中的训练数据通常不充分或存在噪声,这将使得学出的权重不完全可靠。尤其是对规模比较大的集成来说,要学习的权重比较多,较容易导致过拟合。因此,加权平均未必一定优于简单平均。一般而言,在个体学习器性能相差较大时宜使用加权平均,而在个体学习器性能相近时宜使用简单平均。
投票法
对分类任务来说,学习器