好像中国人都知道“众人拾柴火焰高”,“三个臭皮匠赛过诸葛亮”,“集体的智慧是广大的,个人再怎么强大,也创造不了一个中华文明”。这些道理也可以用于指导机器学习算法,而集成学习算法的指导思想正是对许多基模型(也称弱学习器)进行组合来达到 “众人拾柴火焰高”的效果。
集成学习算法尤其是xgboost,lightgbm等在业界应用非常广泛,相关的资料也非常丰富。我写本文的目的,是想结合个人的一些理解讲讲集成学习。前段时间有人问过模型融合的方法,而模型融合与集成学习也有密切的关系,因此我也一并讲下。
Bagging 和 Boosting
在机器学习中,集成学习目前有两种形式:Bagging 和 Boosting。
其中,Bagging方法的基模型之间是相互独立,互不影响的,属于多管齐下的方式,从方差-偏差分解来看,它主要关注的是降低方差。
Bagging的典型算法是随机森林。随机森林中的基模型是决策树,在训练时,每棵树都从训练集中使用bootstrap方法采集一定数量的样本,并且在分裂时考虑的是随机选择的若干变量而非全部变量,最后所有决策树的结果求平均,随机森林在sklearn中有实现。当然除了决策树,Bagging也可以使用其他的基模型,甚至混合使用不同种类的基模型也是可以的。
而Boosting方法训练的基模型之间是迭代递进的关系,属于流水线方式,从方差-偏差分解来看,它主要关注的是降低偏差。 Boosting的典型算法有Adaboost,Xgboost,GBDT,lightgbm等。
其中 Adaboost 算法通过每一轮训练一个弱学习器(比随机猜测稍好些)并调整样本的分布来组合成强大的模型。
GBDT主要的思想是对损失函数的负梯度进行不断拟合,当损失函数使用均方误差时,相当于拟合残差。
Xgboost 和 lightgbm较为相似,与GBDT不同的是,前二者使用了当前模型损失的梯度及二阶导数。xgboost是建树时逐层训练,在分裂节点时需要预排序,遍历每个分隔点计算增益,消耗空间较大,也不支持分类变量的自动处理。
lightgbm建树时是面向叶节点的,可以支持分类型变量的处理,这就免去了对分类变量的one-hot等编码,减少了模型变量和数据量,同时使用直方图来加速计算。
模型融合方法
模型融合是一种集成模型的策略,主要用于bagging方法中对基模型结果进行组合得到最终模型结果。一般来说,模型融合的方式有以下几种。
1. 简单平均法
对基模型的结果求平均后输出,主要用于输出数值型的基模型的融合。适合各个基模型之间效果差异不大的情况。
2. 加权平均法
加权平均法对各个基模型的结果乘以相应的权重后求平均,也是用于输出数值型的基模型的融合。权重一般从训练数据中学习,或根据基模型的效果调整权重,适用于各个基模型之间效果差异较大的情况。
3. 相对多数投票法
主要用于分类算法的融合。每个基模型输出一个类标记作为投票,选择其中得票最多的类标记作为最终类标记,若有多个最高得票,随机选择其中一类输出。
4. 绝对多数投票法
主要用于分类算法融合。每个基模型输出一个类标记作为投票,选择其中得票超过半数的作为最终类,若票数都少于参数,就拒绝预测,比较强势、精致。
5. 加权投票法
用于分类算法融合。对相对多数投票法和绝对多数投票法改进,每个基模型投票带权重,有的基模型比较强投票分量重,比如狼人杀里警长一个人1.5票。
6. stacking 法
当训练集数据很多时,可以使用更为强大的stacking融合方法,它的将多个初级学习器(基模型)的输出作为新的训练集,用来训练一个新的二级模型。一般情况下,初级学习器是不同类型的算法。直接使用初级学习器对训练集的打分作为变量进行训练时,过拟合风险很大,因此一般使用交叉验证法产生新的训练集。
如上图所示。每个学习器都在原训练集上做k折交叉验证(图中k=5),用其中的k-1折训练,其余一折做预测,然后合并k折的预测结果组成一列新的变量。假设有n个学习器独立训练,会产生n个新的变量,将这些新变量合并成一个新的数据集就是新训练集,之后用于训练二级模型。
新测试集的产生方式与新训练集产生相似,如上图。每一折模型训练完毕后都要对原测试集打分,然后将k折打分结果求平均分,作为新的变量。n个学习器最终产生n个新变量,这些变量与新训练集的变量一一对应,可作为新的测试集用于二级模型的测试。
stacking法缺点是操作比较复杂。优点是使用了多次cv,结果会更加稳健。
7. blending 法
blending法与stacking 法大致相同,只是 blending法不使用k-折交叉验证来训练和产生新数据集,而是简单的使用留出法,比如对原训练集再按照 7:3进行拆分,然后训练基学习器对30%预测的结果作为新的变量用于二级模型训练,对原测试集预测的结果作为新测试集的变量。
blending法的缺点是使用了更少的数据,没有做cv,结果不够稳健,优点是操作相比stacking简单。
stacking 实例
下面自己造一些数据,使用随机森林,Adaboost,GBDT,LR作为基学习器,使用LR 做二级融合模型,如下。
领取专属 10元无门槛券
私享最新 技术干货