- 原文地址:Ensemble Learning to Improve Machine Learning Results
- 原文做者:Vadim Smolyakov
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:Starrier
- 校对者:haiyang-tju, TrWestdoor
集成学习能够经过组合多种模型来提升机器学习的结果。这种方法相对于单个模型,能够为结果带来更好的性能预测。这也是集成方法在诸多久负盛名的机器学习竞赛(如 NetFlix 竞赛、KDD 2009 和 Kaggle)中位居第一的缘由。*。html
Statsbot 团队为了让你了解这种方法的优势,邀请了数据科学家 Vadim Smolyakov 来带你一块儿深刻研究三种基本的集成学习技术。前端
集成方法是将多个机器学习技术组合成一个预测模型的元算法,它能够进行 decrease variance (bagging)、bias (boosting) 或者 改进预测 (stacking)。python
集成学习能够分红两组:android
大多数集成方法都使用单基学习算法来生成同类的学习对象,即相同类型的学习对象,从而造成集成。ios
也有一些使用不一样类型的方法,即不一样类型的学习对象,会致使异构集成。为了使集成方法比它的任何一个成员更精确,基础学习对象必须尽量准确,尽量多样化。git
Bagging 表示自助汇聚(bootstrap aggregation)。下降估计方差的一种方法是将多个估计平均在一块儿。例如,咱们能够在数据的不一样子集(随机选择和替换)上训练 M 个不一样的树,并计算集成。github
Bagging 使用自助采样来获取训练基础学习对象的数据子集。为了聚合基础学习对象的输出,bagging 使用分类投票和回归平均。算法
咱们能够在鸢尾花数据集分类的背景下研究 bagging 问题。咱们能够选择两个基础估计器:一个决策树和一个 k-NN 分类器。图一显示了基础估计器的学习决策树边界以及应用鸢尾花数据集的 bagging 集成。bootstrap
Accuracy: 0.63 (+/- 0.02) [Decision Tree] Accuracy: 0.70 (+/- 0.02) [K-NN] Accuracy: 0.64 (+/- 0.01) [Bagging Tree] Accuracy: 0.59 (+/- 0.07) [Bagging K-NN]后端
决策树显示了 axes 的平行边界,当 k=1 时的最近临界点与数据点很是靠近。Bagging 集成使用 10 种基估计器来进行训练,训练数据的子采样为 0.8,特征的子采样为 0.8。
相较于 K-NN bagging 集成,决策树 bagging 集成具备更高的精确度。K-NN 对训练样本的扰动不太敏感,所以被称为稳定的学习对象。
将稳定的学习对象组合在一块儿并不都是有利的,由于有时这样的集成无利于提升泛化性能。
图中还显示了在测试时,随着集成度的提升精确度也会随之提升。基于交叉验证的结果,咱们能够看到精确度的提高大约会在有 10 个基估计器时趋于稳定。所以,添加超过 10 个基估计器只会增长计算复杂度,而不会提升鸢尾花数据集的准确度。
咱们还能够看到 bagging 树集成的学习曲线。注意,训练数据的平均偏差是 0.3,测试数据的偏差曲线是 U 型。训练和测试偏差之间的最小差距发生在训练集大小的 80% 左右。
一种经常使用的集成算法是随机森林。
在随机森林中,集成的每一棵树都是从训练集中用替换(例如,引导样本)绘制样本构建的。此外,不使用全部的特性,而是选择一个随机子集的特征,进一步随机化树。
结果,森林的误差略有增长,但因为相关性较弱的树木被平均化,从而致使方差减少,所以造成了一个总体上更好的模型。
在一个很是随机的树中,算法的随机性更进一步:分裂阀值是随机的。对于每一个候选特征,阈值都是随机抽取的,而不是寻找最具鉴别性的阈值,并选择这些随机生成的阀值中的最佳阀值做为分割规则。这一般会使模型的方差减小得多一点,但代价是误差增长得多一点。
Boosting 是指可以将弱学习对象转化为强学习对象的一系列算法。Boosting 的主要原理是对一系列仅略好于随机预测的弱学习模型进行拟合,例如小决策树 —— 对数据进行加权处理。对前几轮错误分类的例子给予更多的重视。
而后,经过加权多数投票(分类)或加权和(回归)组合预测,生成最终预测。Boosting 和 committee(如 bagging)的主要区别在于,基础学习对象是按加权版本的数据顺序进行训练的。
下述算法描述了使用最普遍的,称为 AdaBoost 的 boosting 算法,它表明着自适应加强。
咱们看到,第一个基分类器 y1(x) 是使用相等的加权系数来训练的,这些系数是相等的。在随后的加强轮次中,对于被错误分类的数据点增长加权系数,对于正确分类的数据点则减少加权系数。
数量 epsilon 表示每一个基分类器的加权错误率。所以,加权系数 α 赋予更准确的分类器更大的权重。
AdaBoost 算法如上图所示。每一个基学习器由一棵深度为 1 的决策树组成,从而根据一个特征阀值对数据进行分类(分为两个区域),该区域由一个与其中一个轴平行的线性决策面隔开。该图还显示了测试精度如何随着集成的大小和训练测试数据的学习曲线的提升而提升。
梯度树 Boosting 是 bootsting 对任意可微损失函数的推广。它既可用于回归问题,也可用于分类问题。梯度 Boosting 以顺序的方式创建模型。
选择决策树 hm(x) 在每一个阶段使用给定当前的 Fm-1(x) 来最小化损失函数 L。
回归算法和分类算法在所使用的损失函数类型上有所区别。
Stacking 是一种经过元分类器或元回归器来将多种分类或回归模型结合在一块儿的集成学习技术。基于一套完整的训练集对该基础模型进行训练,而后将该元模型做为特征所述基础级模型的输出进行训练。
基础级一般由不一样的学习算法组成,所以 stacking 集成每每是异构的。下面的算法总结了 stacking。
上图的右上子图显示了如下准确度:
Accuracy: 0.91 (+/- 0.01) [KNN] Accuracy: 0.91 (+/- 0.06) [随机森林] Accuracy: 0.92 (+/- 0.03) [Naive Bayes] Accuracy: 0.95 (+/- 0.03) [Stacking Classifier]
Stacking 集成如上所示。它由 K-NN、随机森林和朴素贝叶斯基分类器组成,其预测用 Logistic 回归做为元分类器。咱们能够看到 stacking 分类器实现了决策边界的混合。该图还代表,stacking 比单个分类器具备更高的精度,而且是基于学习曲线,没有出现过拟合的迹象。
Stacking 是赢取 Kaggle 数据科学竞赛的经常使用技术。例如,Otto 组产品分类挑战的第一名是由 30 个模型组成的 stacking 集成,它的输出被做为三种元分类器的特征:XGBoost、神经网络和 Adaboost。更多细节能够在此查看。
本文生成全部图像的代码均可以在,你能够在 ipython notebook 上查看。
除了本文所研究的方法,在深度学习中使用多样化训练和精确的分类器来集成也是很是广泛的方式。多样化也能够经过变化的架构、设置超参数以及使用不一样的训练技术来实现。
集成方法在具备挑战性的数据集上很是成功地达到了创纪录的性能,并在 Kaggle 数据科学竞赛中名列前茅。
若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。