集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务。
如何产生“好而不同”的个体学习器,是集成学习研究的核心。
集成学习的思路是通过合并多个模型来提升机器学习性能,这种方法相较于当个单个模型通常能够获得更好的预测结果。这也是集成学习在众多高水平的比赛如奈飞比赛,KDD和Kaggle,被首先推荐使用的原因。
一般来说集成学习可以分为三大类:
集成学习方法也可以归为如下两大类:
大部分集成模型都通过一个基础学习算法来生成一个同质的基础学习器,即同类型的学习器,也叫同质集成。
有同质集成就有异质集成,为了集成后的结果表现最好,异质基础学习器需要尽可能准确并且差异性够大。
Bagging是引导聚合的意思。减少一个估计方差的一种方式就是对多个估计进行平均。例如,我们可以用训练集的不同子集(随机选择并替代训练集)训练M个不同的树然后计算最后的结果:
Bagging使用装袋采样来获取数据子集训练基础学习器。通常分类任务使用投票的方式集成,而回归任务通过平均的方式集成。
1)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping(有放回)的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(我们这里假设k个训练集之间是相互独立的,事实上不是完全独立)
2)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。但是是同种模型。(注:,k个训练集虽然有重合不完全独立,训练出来的模型因为是同种模型也是不完全独立。这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
3)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)
对于Bagging需要注意的是,每次训练集可以取全部的特征进行训练,也可以随机选取部分特征训练,例如随机森林就是每次随机选取部分特征
常用的集成算法模型是随机森林和随机树
在随机森林中,每个树模型都是装袋采样训练的。另外,特征也是随机选择的,最后对于训练好的树也是随机选择的。
这种处理的结果是随机森林的偏差增加的很少,而由于弱相关树模型的平均,方差也得以降低,最终得到一个方差小,偏差也小的模型。
在一个极端的随机树算法中,随机应用的更为彻底:训练集分割的阈值也是随机的,即每次划分得到的训练集是不一样的。这样通常能够进一步减少方差,但是会带来偏差的轻微增加。
下面通过应用Iris数据集的分类问题来距离说明bagging。
我们可以使用两种基础模型:决策树和KNN。图中展示了基础模型与集成模型学习得到的决策边界。
Accuracy: 0.63 (+/- 0.02) [Decision Tree] Accuracy: 0.64 (+/- 0.01) [Bagging Tree]
Accuracy: 0.70 (+/- 0.02) [K-NN] Accuracy: 0.59 (+/- 0.07) [Bagging K-NN]
决策树学到的是轴平行边界,然而k=1最近邻对数据拟合的最好。bagging通过训练10个基础模型能过随机选择80%的数据作为训练集,同样随机选择80%的特征进行训练。
决策树bagging集成相比K-NN bagging集成获得了更高的准确率。K-NN对于训练样本的扰动并不敏感,这也是为什么K-NN成为稳定学习器的原因。
整合稳定学习器对于提升泛化性能没有帮助。
图像结果同样展示了通过增加集成模型的个数带来的测试准确率变化。基于交叉验证的结果,我们可以看到整合基础模型个数大于10个之后性能就基本不再提升了,只是带来了计算复杂度的增加。
最后一张图绘制的是集成学习模型的学习曲线,注意训练集数据的平均误差为0.3,在对训练集做80%采样的时候训练集和验证集误差最小。
Boosting指的是通过算法集合将弱学习器转换为强学习器。boosting的主要原则是训练一系列的弱学习器,所谓弱学习器是指仅比随机猜测好一点点的模型,例如较小的决策树,训练的方式是利用加权的数据。在训练的早期对于错分数据给予较大的权重。
对于训练好的弱分类器,如果是分类任务按照权重进行投票,而对于回归任务进行加权,然后再进行预测。boosting和bagging的区别在于是对加权后的数据利用弱分类器依次进行训练。
boosting是一族可将弱学习器提升为强学习器的算法,这族算法的工作机制类似:
下面描述的算法是最常用的一种boosting算法,叫做AdaBoost,表示自适应boosting。
AdaBoost算法每一轮都要判断当前基学习器是否满足条件,一旦条件不满足,则当前学习器被抛弃,且学习过程停止。
AdaBoost算法中的个体学习器存在着强依赖关系,应用的是串行生成的序列化方法。每一个基生成器的目标,都是为了最小化损失函数。所以,可以说AdaBoost算法注重减小偏差。
由于属于boosting算法族,采用的是加性模型,对每个基学习器的输出结果加权处理,只会得到一个输出预测结果。所以标准的AdaBoost只适用于二分类任务。
我们可以看到第一个分类器y1(x)是用相等的权重系数进行训练的。在随后的boosting中,错分的数据权重系数将会增加,正确分类的数据权重系数将会减小。
epsilon表示单个分类器的加权错误率。alpha是分类器的权重,正确的分类器alpha较大。
AdaBoost算法的表现如上图所示。每个基础模型包含一个深度为1的决策树,这种决策树依靠线性划分进行分类,决策平面跟其中一个轴平行。上图还展示了集成规模的增加带来的测试准确率变化以及训练和测试集的学习曲线。
梯度树提升(Gradient Tree Boosting)是一个boosting算法在损失函数上的泛化。能够用于分类和回归问题。Gradient Boosting采用串行方式构建模型。
每新增一个决策树hm(x)都尽可能的选择是的当前模型Fm-1(x)损失最小的那个:
注意:分类和回归使用的损失函数有所差别。
Stacking是通过一个元分类器或者元回归器来整合多个分类模型或回归模型的集成学习技术。基础模型利用整个训练集做训练,元模型将基础模型的特征作为特征进行训练。
基础模型通常包含不同的学习算法,因此stacking通常是异质集成。算法伪代码如下:
各基础模型的预测结果如下:
Accuracy: 0.91 (+/- 0.01) [KNN]
Accuracy: 0.91 (+/- 0.06) [Random Forest]
Accuracy: 0.92 (+/- 0.03) [Naive Bayes]
Accuracy: 0.95 (+/- 0.03) [Stacking Classifier]
Stacking集成效果如上图所示。分别在K-NN,Random Forest,Naive Bayes做训练和预测,然后将其输出结果作为特征,利用逻辑回归作为元模型进一步训练。如图所示,stacking集成的结果由于每个基础模型,并且没有过拟合。
Stacking被Kaggle竞赛获奖者广泛使用。例如,Otto Group Product分类挑战赛的第一名通过对30个模型做stacking赢得了冠军。他将30个模型的输出作为特征,继续在三个模型中训练,这三个模型XGBoost,Neural Network和Adaboost,最后再加权平均。详见文章(https://www.kaggle.com/c/otto-group-product-classification-challenge/discussion/14335)。
结构如下:
集成学习的第二类模型,为了提高集成的泛化能力,每个基学习器之间不存在很强的依赖性,所以最终预测结果时,需要一定的策略对T个结果进行结合。下面介绍结合策略。
对数值型输出,最常见的结合策略是使用平均法。
一般而言,在个体学习器性能相差较大时,宜使用加权平均法,而在个体学习器性能相近时,宜使用简单平均法。
这一点在第二个项目中深有体会,该模型有三个损失函数,每个损失函数的性能差别比较大,所以用了加权,在第一个数据集中调好参数以后,在第二个数据集中,效果就不是很好,需要重新进行调参。
当训练数据很多时,一种更为强大的结合策略是使用“学习法”,即通过另一个学习器来进行结合。
本文的代码参见: ipython notebook.
除了本文所提到的集成学习研究之外,集成学习还被广泛应用于利用多种分类器做训练的深度学习模型中。深度学习模型中的分类器可能在架构、超参数以及训练技巧上存在差异,都可以进行集成。
集成学习已经被证明在Kaggle数据科学竞赛中能够获得较好的成绩。
参考:
https://blog.statsbot.co/ensemble-learning-d1dcd548e936
https://www.jianshu.com/p/0a23d578ac81