集成学习(Ensemble Learning),顾名思义就是将多个学习器集成为一个学习器,集百家之长来使最后的成果表现优异。
集成学习的方法可以分为两类:
一类是序列化集成:这一类学习器参与训练时需要之前的学习器的学习结果,利用了学习器之间的依赖关系,使其需要串行组合(如AdaBoost,GBM)。
另一类是并行集成,这类学习器不像上一类有强依赖关系,利用其相互之间的独立性对学习器并行组合(如Bagging)。
所以集成学习是一种学习器结合的方法,通常多个学习器的效果比单个学习器的性能会更优。下面介绍几个常用的算法:Bagging、AdaBoost、Gradient Boosting Decision Tree (GBDT)。
Bagging
Bagging的算法思想很简单,从训练集中随机有放回的提取一部分数据作为一个子训练集,然后提取N个这样的子训练集分别训练出N个不同的模型,对于分类问题最终采用投票的方式少数服从多数获得分类结果;对于回归问题计算各模型结果的均值作为结果。
Bagging的方法主要降低了分类器的方差,提高了模型的泛化性,并且由于训练时不存在权重,训练过程中不会侧重于任何特定的实例。
Bagging典型的代表就是Random Forest(随机森林)。
随机森林这一算法充分利用了随机性,它不只在获取子数据集取样时随机,同时还随机选择特征,即在决定决策树结点时先随机选取部分属性,然后再从所选属性集中选出最优划分。随机森林在实现时一般采用CART,他继承了CART的优点同时克服了完全生长树的缺点,可以高度并行化。
AdaBoost
AdaBoost在前面提到是串行组合起来的,他的强依赖关系从上面这幅图就可以清晰地看出。AdaBoost的训练过程可以总结为以下:
首先第一次训练对训练数据赋予相等的权值,如第一列所示,±图案大小相同,经过第一次训练之后获得第一个分类器。之后对分类错误的数据增大权重,而对训练正确的数据减小权重,从第二列图中通过符号的大小发生变化表现出来,这样就解决了如何改变训练数据权重的问题,这样可以使没被分类正确的数据在下一轮训练获得更高的关注度,而分类正确的可以适当减少关注度。改变权重后训练之后的训练集,不断根据之前的训练结果调整下一次训练时的权重集合,这就是他们的强依赖关系。最后在整合分类器时,对于训练时表现好的分类器赋予更大的权重,表现差的赋予小的权重,这样的加权多数表决的方法使组合获得的强分类器性能更优。
AdaBoost在不改变训练数据的情况下,不断改变训练数据的权值,使训练数据在不同分类器中的作用效果不同,可以有效实现分类器的互补,后一个分类器通过权值的改变训练出弥补前一个分类器的表现较差的部分的结果,这即为AdaBoost的目的,以此最终获得强分类器。
Gradient Boosting Decision Tree(GBDT)
GBDT中文称作梯度提升树。首先需要明确,它是由回归树结合而成。因为GBDT的计算过程是一个累加的过程,而对于分类树的结果进行加和是没有意义的(如男+女),而对于回归树的加和获得的数据是有意义的(12岁+3岁),因此GBDT的实现是多棵回归树结合而成,即使是实现分类效果,也是由回归树经过处理实现。
这里提到梯度提升,和Bagging中提到的投票方法完全不同。他是通过不断拟合模型的残差来实现优化结果的目的。用一个常用的年龄的例子来说。如果一个人的真实年龄为18岁,训练第一个模型预测他的年龄为12岁,这时出现了6岁的残差·,而下一个模型,就是利用这个残差去训练,如果下一个模型能预测出这6岁的残差,两模型进行加和,就可以得到正确的18岁的答案。如果预测为5岁,则还有1岁的残差,那下一步再用这一岁去训练下一个模型,然后进行加和。这个不断拟合残差进行训练的过程,就是GBDT的实现思想。
在计算过程中,由于损失在一般情况下不像平方损失那样容易计算,因此对于一般的损失函数采用一个普适的策略,使用最速下降法近拟。即利用损失函数的负梯度在当前模型中的值作为残差的近似值来拟合回归树,只需一次求导即可实现。
这样利用残差值和训练集即可更新获得下一棵回归树(ft(x))。最后的实现就是一个加和过程,即可获得最终的决策树(f(x))。
对于GBDT为防止过拟合可以加入正则化项,即加入一个λ来控制过拟合,也可利用决策树处理过拟合时常用的方法即正则化剪枝进行防止过拟合。
GBDT小结:
由于GBDT可以使用任意损失函数,因此在训练时选用一些健壮的损失函数对数据集中的异常值具有很强的鲁棒性。并且GBDT对于连续值和离散值都可以进行训练,十分灵活。
但是由于回归树之间的强依赖关系,很难实现并行训练。可以利用自采样的SGBT实现部分并行。