一、引言
我理解的Kaggle比赛中提高成绩主要有3个地方
- 特征工程
- 调参
- 模型融合
在机器学习训练完模型之后我们要考虑模型的效率问题,常用的模型效率分析手段有:
- 研究模型学习曲线,判断模型是否过拟合或者欠拟合,并做出相应的调整;
- 对于模型权重参数进行分析,对于权重绝对值高/低的特征,可以对特征进行更细化的工作,也可以进行特征组合;
- 进行bad-case分析,对错误的例子分析是否还有什么可以修改挖掘
- 模型融合:模型融合就是训练多个模型,然后按照一定的方法集成过个模型,应为它容易理解、实现也简单,同时效果也很好,在工业界的很多应用,在天池、kaggle比赛中也经常拿来做模型集成。
二、模型融合初探
2.1 什么叫做模型融合
一般来说,通过融合多个不同的模型,可能提升机器学习的性能,这一方法在各种机器学习比赛中广泛应用,比如在kaggle上的otto产品分类挑战赛①中取得冠军和亚军成绩的模型都是融合了1000+模型的“庞然大物”。常见的集成学习&模型融合方法包括:简单的Voting/Averaging(分别对于分类和回归问题)、Stacking、Boosting和Bagging。
下图介绍了模型融合的一般结构:先产生一组”个体学习器 ,再用某种策略将它们结合起来,加强模型效果。
2.2 模型融合应用广泛的原因
可以通过数学证明模型,随着集成中个体分类器数目T 的增大,集成的错误率将指数级下降,最终趋向于零。具体证明在周志华和李航老师的书中都有。它不是具体的指某一个算法,而是一种把多个弱模型融合合并在一起变成一个强模型的思想,也称为集成学习(Ensemble Learning):
1、单个模型容易过拟合,多个模型融合可以提高范化能力
2、单个模型预测能力不高,多个模型往往能提高预测能力
3、对于数据集过大或过小,可以分别进行划分和有放回的操作,产生不同的数据子集,然后通过数据子集训练不同的分类模型,最终合并成一个大的分类器
4、对于多个异构的特征集的时候,很难进行融合,可以考虑每个数据集构建一个分类模型,然后将多个模型融合
5、模型融合算法成功的关键在于能保证弱分类器(弱模型)的多样性,融合不稳定的学习算法能得到更明显的性能提升
2.3 模型融合的条件
个体学习器准确性越高、多样性越大,则融合越好。(,E代表融合后的误差加权均值,代表个体学习器的误差加权均值,代表模型的多样性,也就是各个模型之间的分歧值)
Base Model 之间的相关性要尽可能的小。这就是为什么非 Tree-based Model 往往表现不是最好但还是要将它们包括在 Ensemble 里面的原因。Ensemble 的 Diversity 越大,最终 Model 的 Bias 就越低。
Base Model 之间的性能表现不能差距太大。这其实是一个 Trade-off,在实际中很有可能表现相近的 Model 只有寥寥几个而且它们之间相关性还不低。但是实践告诉我们即使在这种情况下 Ensemble 还是能大幅提高成绩。
2.4 模型融合的分类
按照个体学习器的关系可以分为两类:
- 个体学习器问存在强依赖关系、必须串行生成的序列化方法,代表Boosting方法;
- 个体学习器间不存在强依赖关系、可同时生成的并行化方法,代表是Bagging 和”随机森林” 。
2.5 集成学习与模型融合的区别(其实区别不大)
集成学习是指多个弱分类器有关联地逐步训练集成为强分类器,这种弱分类器一定是同质的分类器。一般把弱分类器集成的强分类器看成是一个分类器。
而多模型融合是多个分类器,这里面比如集成学习得到的强分类器看成是一个分类器。多模型融合一般用来做信息补充或互补,比如用时空模型来为行人重识别模型抽取时空信息作补充。
三、模型融合详细介绍
3.1 模型融合基础算法
投票法(Voting):如果是分类模型,每个模型都会给出一个类别预测结果,通过投票的方式,按照少数服从多数的原则融合得到一个新的预测结果。
均值法(Averaging):如果是回归模型,每个模型给出的预测结果都是数值型的,这时候我们可以通过求所有子模型的预测结果的均值作为最终的融合结果。
Bagging + 决策树=随机森林
Boosting + 决策树=提升树
Gradient Boosting+决策树=GBDT总结
3.2 个体学习器依赖的融合-boosting(串行)
3.2.1 boosting方法的思想
Boosting是一种将各种弱分类器串联起来的集成学习方式,每一个分类器的训练都依赖于前一个分类器的结果,顺序运行的方式导致了运行速度慢。和所有融合方式一样,它不会考虑各个弱分类器模型本身结构为何,而是对训练数据(样本集)和连接方式进行操纵以获得更小的误差。但是为了将最终的强分类器的误差均衡,之前所选取的分类器一般都是相对比较弱的分类器,因为一旦某个分类器较强将使得后续结果受到影响太大。所以多用于集成学习而非模型融合(将多个已经有较好效果的模型融合成更好的模型)。
Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2;如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。
引用加州大学欧文分校Alex Ihler教授的两页PPT
其基本工作机制如下:
1、从初始样本集中训练出一个基学习器;
2、根据基学习器的表现对样本集分布进行调整,使得做错的样本能在之后的过程中受到更多的关注;
3、用调整后的样本集训练下一个基学习器;
4、重复上述步骤,直到满足一定条件。
注意,一般只有弱分类器都是同一种分类器(即同质集成)的时候,才将弱分类器称为基学习器,如果是异质集成,则称之为个体学习器。由于不是本文重点,所以此处不作区分。特此说明。
最终将这些弱分类器进行加权相加。
Boosting融合在每次训练模型时更关注上一次的模型错判的样例,并且会给这些错判的样例更大的权重,这样做的目的是就是为了加强对错判样本的学习,让模型通过不断的迭代,效果越来越好。最终将多次迭代的训练得到的弱模型进行加权求和,得到最终的强模型。因为Boosting框架各模型间是有依赖关系存在的,所以它是一种串行的融合方法。
3.2.2 常见的Boosting方法有Adaboost、GBDT、XGBOOST等(只介绍基本原理)
一、Adaboost
Adaboost算法基本原理就是将多个弱分类器(弱分类器一般选用单层决策树)进行合理的结合,使其成为一个强分类器。
Adaboost采用迭代的思想,每次迭代只训练一个弱分类器,训练好的弱分类器将参与下一次迭代的使用。也就是说,在第N次迭代中,一共就有N个弱分类器,其中N-1个是以前训练好的,其各种参数都不再改变,本次训练第N个分类器。其中弱分类器的关系是第N个弱分类器更可能分对前N-1个弱分类器没分对的数据,最终分类输出要看这N个分类器的综合效果。
Adaboost算法原理分析和实例+代码(简明易懂)
二、GBDT
GBDT (Gradient Boosting Decision Tree) 梯度提升迭代决策树。GBDT 也是 Boosting 算法的一种,但是和 AdaBoost 算法不同(AdaBoost 算法上一篇文章已经介绍);区别如下:AdaBoost 算法是利用前一轮的弱学习器的误差来更新样本权重值,然后一轮一轮的迭代;GBDT 也是迭代,但是 GBDT 要求弱学习器必须是 CART 模型,而且 GBDT 在模型训练的时候,是要求模型预测的样本损失尽可能的小。GBDT 算法
GBDT 直观理解:每一轮预测和实际值有残差,下一轮根据残差再进行预测,最后将所有预测相加,就是结果。
三、XGBOOST
XGBoost全名叫(eXtreme Gradient Boosting)极端梯度提升,经常被用在一些比赛中,其效果显著。它是大规模并行boosted tree的工具,它是目前最快最好的开源boosted tree工具包。XGBoost 所应用的算法就是 GBDT(gradient boosting decision tree)的改进,既可以用于分类也可以用于回归问题中。机器学习--boosting家族之XGBoost算法
3.3 个体学习器不依赖的融合-bagging(并行)
Bagging就是采用有放回的方式进行抽样,用抽样的样本建立子模型,对子模型进行训练,这个过程重复多次,最后进行融合。
3.3.1 Bagging即套袋法,其算法过程如下
从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的);
每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)
注:Bagging算法不用我们自己实现,随机森林就是基于Bagging算法的一个典型例子,采用的基分类器是决策树。R和python都集成好了,直接调用。
3.3.2 bagging算法思想
bagging是bootstrap aggregating的缩写。该算法的思想是让学习算法训练多轮,每轮的训练集由从初始的训练集中随机取出的n个训练样本组成,某个初始训练样本在某轮训练集中可以出现多次或根本不出现(即所谓的有放回抽样),训练之后可得到一个预测函数序列h_1,? ?h_n ,最终的预测函数H对分类问题采用投票方式,对回归问题采用简单平均方法对新示例进行判别。上面的算法思想可通过下图来进行理解:
3.3.3 随机森林: 对bagging算法的改进------------随机森林(原理/样例实现/参数调优)
改进一:基本学习器限定为决策树
改进二:除了bagging的在样本上加上扰动,同时在属性上也加上扰动,即是在决策树学习的过程中引入了随机属性选择,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。
随机森林的主要优点是:
- 具有极高的准确率
- 随机性的引入,使得随机森林不容易过拟合
- 随机性的引入,使得随机森林有很好的抗噪声能力
- 能处理很高维度的数据,并且不用做特征选择
- 既能处理离散型数据,也能处理连续型数据,数据集无需规范化
- 训练速度快,可以得到变量重要性排序
- 容易实现并行化
随机森林的主要缺点是:
- 当随机森林中的决策树个数很多时,训练时需要的空间和时间会较大
- 随机森林模型还有许多不好解释的地方,有点算个黑盒模型
算法过程
- 从原始训练集中使用Bootstraping方法随机有放回采样选出m个样本,共进行n_tree次采样,生成n_tree个训练集
- 对于n_tree个训练集,我们分别训练n_tree个决策树模型
- 对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数选择最好的特征进行分裂
- 每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝
- 将生成的多棵决策树组成随机森林。对于分类问题,按多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果
3.4 Bagging,Boosting二者之间的区别
1、样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2、样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3、预测函数:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4、并行计算:
Bagging:各个预测函数可以并行生成,即个体学习器间不存在强依赖关系,可同时生成的并行化方法。
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。即个体学习器间存在强依赖关系,不可同时生成的序列化方法。
5、bagging减少variance,而boosting是减少bias
Bagging对样本重采样,对每一重采样得到的子样本集训练一个模型,最后取平均。由于子样本集的相似性以及使用的是同种模型,因此各模型有近似相等的bias和variance(事实上,各模型的分布也近似相同,但不独立)。另一方面,若各子模型独立,则有,此时可以显著降低variance。若各子模型完全相同,则此时不会降低variance。bagging方法得到的各子模型是有一定相关性的,属于上面两个极端状况的中间态,因此可以一定程度降低variance。
boosting是在sequential地最小化损失函数,其bias自然逐步下降。但由于是采取这种sequential、adaptive的策略,各子模型之间是强相关的,于是子模型之和并不能显著降低variance。所以说boosting主要还是靠降低bias来提升预测精度。
3.5 Stacking---各种机器学习比赛中被誉为“七头龙神技”
但因其模型的庞大程度与效果的提升程度往往不成正比,所以一般很难应用于实际生产中
下面以一种易于理解但不会实际使用的两层的stacking方法为例,简要说明其结构和工作原理:(这种模型问题将在后续说明)
假设我们有三个基模型M1,M2,M3,用训练集对其进行训练后,分别用来预测训练集和测试集的结果,得到P1,T1,P2,T2,P3,T3
我们将P1,P2,P3合并,作为下一层的训练集,用新的训练集训练模型M4。然后用M4来预测新的测试集(T1,T2,T3合并)得到最终的预测结果。
这种方法的问题在于,模型M1/2/3是我们用整个训练集训练出来的,我们又用这些模型来预测整个训练集的结果,毫无疑问过拟合将会非常严重。因此在实际应用中往往采用交叉验证的方法来解决过拟合问题。
首先放几张图,我们着眼于Stacking方法的第一层,以5折交叉验证为例说明其工作原理:
1、首先我们将训练集分为五份。
2、对于每一个基模型来说,我们用其中的四份来训练,然后对未用来的训练的一份训练集和测试集进行预测。然后改变所选的用来训练的训练集和用来验证的训练集,重复此步骤,直到获得完整的训练集的预测结果。
3、对五个模型,分别进行步骤2,我们将获得5个模型,以及五个模型分别通过交叉验证获得的训练集预测结果。即P1、P2、P3、P4、P5。
4、用五个模型分别对测试集进行预测,得到测试集的预测结果:T1、T2、T3、T4、T5。
5、将P1~5、T1~5作为下一层的训练集和测试集。在图中分别作为了模型6的训练集和测试集。
Stacking方法的整体结构如下图所示:
3.6 Blending----与Stacking类似,只是由K-FoldCV 改成 HoldOutCV
Blending是一种和Stacking很相像的模型融合方式,它与Stacking的区别在于训练集不是通过K-Fold的CV策略来获得预测值从而生成第二阶段模型的特征,而是建立一个Holdout集,例如10%的训练数据,第二阶段的stacker模型就基于第一阶段模型对这10%训练数据的预测值进行拟合。
说白了,就是把Stacking流程中的K-Fold CV 改成HoldOut CV。
以第一层为例,其5折HoldOut交叉验证将如下图所示:
Stacking与Blending相比,Blending的优势在于:
1、Blending比较简单,而Stacking相对比较复杂;
2、能够防止信息泄露:generalizers和stackers使用不同的数据;
3、不需要和你的队友分享你的随机种子;
而缺点在于:
1、只用了整体数据的一部分;
2、最终模型可能对留出集(holdout set)过拟合;
3、Stacking多次交叉验证要更加稳健。
四、模型融合的结合策略
基本学习器学习完后,需要将各个模型进行融合,常见的策略有:
1,平均法: 平均法有一般的评价和加权平均,这个好理解。对于平均法来说一般用于回归预测模型中,在Boosting系列融合模型中,一般采用的是加权平均融合。
2,投票法:有绝对多数投票(得票超过一半),相对多数投票(得票最多),加权投票。这个也好理解,一般用于分类模型。在bagging模型中使用。
3,学习法:一种更为强大的结合策略是使用”学习法”,即通过另一个学习器来进行结合,把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器。常见的有Stacking和Blending两种
(1)Stacking方法: Stacking 先从初始数据集训练出初级学习器,然后”生成”一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记。
stacking一般使用交叉验证的方式,初始训练集D 被随机划分为k 个大小相似的集合D1 , D2 , … , Dk,每次用k-1个部分训练T个模型,对另个一个部分产生T个预测值作为特征,遍历每一折后,也就得到了新的特征集合,标记还是源数据的标记,用新的特征集合训练一个集合模型。
(2)Blending方法: Blending与Stacking大致相同,只是Blending的主要区别在于训练集不是通过K-Fold的CV策略来获得预测值从而生成第二阶段模型的特征,而是建立一个Holdout集,例如说10%的训练数据,第二阶段的stacker模型就基于第一阶段模型对这10%训练数据的预测值进行拟合。说白了,就是把Stacking流程中的K-Fold CV 改成 HoldOut CV。
最后放一张H2O分享的图片总结一下