集成学习(ensemble learning)经过构建并结合多个学习器来完成学习任务。
html
如何产生“好而不一样”的个体学习器,是集成学习研究的核心。python
集成学习的思路是经过合并多个模型来提高机器学习性能,这种方法相较于当个单个模型一般可以得到更好的预测结果。这也是集成学习在众多高水平的比赛如奈飞比赛,KDD和Kaggle,被首先推荐使用的缘由。git
通常来讲集成学习能够分为三大类:github
集成学习方法也能够归为以下两大类:算法
大部分集成模型都经过一个基础学习算法来生成一个同质的基础学习器,即同类型的学习器,也叫同质集成。api
有同质集成就有异质集成,为了集成后的结果表现最好,异质基础学习器须要尽量准确而且差别性够大。架构
Bagging是引导聚合的意思。减小一个估计方差的一种方式就是对多个估计进行平均。例如,咱们能够用训练集的不一样子集(随机选择并替代训练集)训练M个不一样的树而后计算最后的结果:dom
Bagging使用装袋采样来获取数据子集训练基础学习器。一般分类任务使用投票的方式集成,而回归任务经过平均的方式集成。1)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping(有放回)的方法抽取n个训练样本(在训练集中,有些样本可能被屡次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,获得k个训练集。(咱们这里假设k个训练集之间是相互独立的,事实上不是彻底独立)机器学习
2)每次使用一个训练集获得一个模型,k个训练集共获得k个模型。可是是同种模型。(注:,k个训练集虽然有重合不彻底独立,训练出来的模型由于是同种模型也是不彻底独立。这里并无具体的分类算法或回归方法,咱们能够根据具体问题采用不一样的分类或回归方法,如决策树、感知器等)ide
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