模型融合方法最全总结!

Datawhale Datawhale     2022-12-29     233

关键词:

本文是模型融合的经验方法总结。包含了投票法、平均法、排序法、Stacking 和 Blending.

一、背景

之前有段时间打数据挖掘类比赛,看到很多选手用模型融合的技巧,特别是比赛后期的时候,很多选手开始找队友,多数是为了融模型。虽然我也有尝试过一些模型融合,但却一直缺乏体系化了解,所以在看了荷兰Kaggle选手Triskelion的《KAGGLE ENSEMBLING GUIDE》[1],我决定体系化整理下机器学习模型融合的常见方法,自我查缺补漏。

二、融合对象

在讲模型融合方法前,我们先了解下融合对象,我们融的是什么?是不同的个体学习器 (Individual Leaner)。"一个世界从来不是由某个单独个体简单构成的,而是由具有不同属性的个体共同构成的"。对于个体学习器来说,它们的不同体现在:

  • 不同训练数据:数据集使用比例、预处理方法 (缺失值填补、特征工程等);

  • 不同模型结构:RF、XGBoost、LightGBM、CatBoost、CNN、LSTM等;

  • 不同超参:随机种子数、权重初始化、收敛相关参数 (例如学习率、batch size、epoch、早停步数)、损失函数、子采样比例等。

三、融合方法

我一年前秋招有次电话面某公司,让我介绍简历上的项目,其中有个项目是MLR+ARIMA结合在一起做的,然后我说这是模型集成,结果被人驳斥说,这不是模型集成(大概率面试官认为只有Boosting和Bagging是属于模型集成,而其他模型结合不能称作模型集成)。但我事后去翻西瓜书 [2],书上写道:

集成学习 (Ensemble Learning) 通过构建并结合多个学习器来完成学习任务,有时也被称作多分类器系统 (Multi-classifier System)、基于委员会的学习 (Committee-based Learning)等。

《机器学习》- 周志华

所以说,模型集成不是只有同质学习器的集成 (例如Boosting和Bagging) 才称作模型集成,还有异质学习器的集成也是模型集成。OS:面试面得我很冤枉。虽然我觉得称作”模型集成“也没错,但为了避嫌,我这边都统一称作“模型融合"。本文不细讲关于同质学习器集成的内容了 (即Boosting和Bagging),这里,我主要是基于 [1] 的内容主线,分享异质学习器的一些融合手段。

1. 投票法

适用于分类任务,对多个学习器的预测结果进行投票,即少数服从多数。投票法有两种:普通投票法加权投票法。加权的权重可以人工主观设置或者根据模型评估分数来设置权重。投票需要3个及3个以上的模型,同时建议要保证模型的多样性,有时候对同质模型们使用投票法并不能取得较好的表现,这是因为同质模型得到的结果之间可能具有较强的相关性,从而会导致多数人把少数人的好想法给压下去了。为了避免这个问题,可以参考在2014年KDD Cup上Marios Michailid的做法,他对所有结果文件计算Pearson系数,最后选取其中相关性小的模型结果进行投票,分数获得了提升。

2. 平均法

适用于回归分类 (针对概率) 任务,对多个学习器的预测结果进行平均。平均法的好处在于平滑结果,从而减少过拟合。常见的平均法有三种:算术平均法几何平均法加权平均法

假设我们有n个模型的预测结果   ,则三类平均计算方式如下:

(1) 算术平均法

   

(2) 几何平均法

   

(3) 加权平均法

   

几何平均法受极端值的影响较算术平均法小。另外,关于加权平均法的权重,也可以人工主观或根据模型分数来设置。同时也建议尽量平均差异性小的模型们。

3. 排序法 

如果模型评估标准是与排序或者阈值相关 (例如AUC),简单使用平均法并不见得都能取得较好得结果,为什么呢?我们可以看个例子:

图1:算术平均法样例

上图能发现,模型1几乎没有给模型2带来大的影响,因为像这种波动小的模型做融合,对最终结果造成的影响不大。为了解决这个问题,可以考虑使用排序平均法。在赛圈,碰到AUC,很多都会采用这种方法进行模型融合。比如在招商银行的 “消费金融场景下的用户购买预测” 的冠军方案中 [3] 便针对赛题方的AUC评分标准,采用了基于排序的模型融合方法。排序法的具体步骤如下:

(1) 对预测结果进行排序

(2) 对排序序号进行平均

(3) 对平均排序序号进行归一化

这里还是用上面的例子帮助理解:

图2:排序平均法样例

通过平均排序和归一化,我们能发现波动小的模型1给最终的模型融合带来了影响。但在使用排序法的时候,有个地方我们需要注意:我们都知道,排序是针对测试集预测结果来做的,但如果在工业界使用,很多时候会有新样本进来要你预测,此时该怎么办呢?,针对新样本,其实有两种处理方式:

  • 重新排序:将新样本放入原测试集中,重新排序,一旦数据量大,时间复杂度会增加。

  • 参考历史排序:先将历史测试集的预测结果和排序结果保存,新样本进来后,在历史测试集中找到与新样本预测值最近的值,然后取其排序号赋予新样本。之后平均排序,使用历史最大最小值进行归一化操作即可。

4. Stacking

Stacking堆叠法是相对比较高级的模型融合法,也是本文的重点。Stacking的思路是基于原始数据,训练出多个基学习器,然后将基学习器的预测结果组合成新的训练集,去训练一个新的学习器。


Stacking主要分为以下三类:

  • 单层Stacking

  • 多层Stacking

  • 其它技术与Stacking的结合

(1) 单层Stacking

单层Stacking是指在基学习器上只堆叠一层元学习器,这也是最常见的Stacking结构,示意图如下所示:

图3:单层Stacking结构示意图

图3里的基学习器可以是同质或异质的模型,而元学习器在传统做法中是选用逻辑回归模型,当然也能使用非线性模型作为元学习器,例如GBDT, KNN, NN, RF等。比如在 ”天池零基础入门金融风控-贷款违约预测“ 一赛中,TOP6的方案 [4] 使用了LightGBM,CatBoost和XGBoost作为基学习器,然后利用Pearson相关系数分析模型结果差异性,选取差异较大的结果文件,再输入第二层元学习器RF进一步融合结果。如果我们有4个特征的数据集和3个基学习器,,单层Stacking (5-Fold) 的训练和预测的具体细节是怎样的呢?请见下图:

图4:单层Stacking (5-Fold) 的训练预测流程图

单层Stacking在基学习器和元学习器上可灵活选用自己喜欢的模型,甚至说能暴力去做(量力而行):

图5:暴力单层Stacking [1]

除此之外,Stacking在特征上也可以玩出一些花样,其中,[1] 便介绍了两种单层Stacking上的特征交互方法:

  • Feature-weighted Linear Stacking (FWLS):Still等人在论文 [5] 中提出了该方法。基学习器们的预测结果叫元特征,因为它们是用于训练元学习器。FWLS提出可以在元学习器前,对元特征进行特征交互,交互对象可以是元特征本身,也可以是原始特征(即:元特征*元特征元特征*原始特征)。

  • Quadratic Linear Stacking of Models:它采用的特征交互模式是:元特征*元特征+元特征*原始特征。

(2) 多层Stacking

这个是听说的,即增加多层元学习器,但我也没用过。大概结构示意图如下:

图6:双层Stacking结构示意图

(3) 其它技术与Stacking的结合

Stacking可以与无监督学习方法结合。例如:使用t-SNE将数据降维到2或3维,然后用非线性元学习器来融合。案例可参考Kaggle的“Otto Group Product Classification Challenge”中,Mike Kim提出的方法 [6]。

5. Blending

我们思考下Stacking,基学习器和元学习器本质上都是用同一训练集训练的 (虽然输入的x不一样,但标签y一样),这就会造成信息泄露,从而导致元学习器过拟合我们的数据集。为了避免这种问题,Blending方法被提出了,它的想法是:对原始数据集先划分出一个较小的留出集,比如10%训练集被当做留出集,那么Blending用90%的数据做基学习器的训练,而10%留出集用作训练元学习器,这样基学习器和元学习是用不同数据集来训练的。Blending的示意图如下所示:

图7:Blending的训练预测流程图

上图的红框是区分Stacking的关键。相比于Stacking,Blending能有效防止信息泄露,但也正因为如此,元学习器只用了较小部分的数据集进行训练,且容易对留出集过拟合。如果数据量有限,个人更偏好于Stacking

四、总结

模型融合看起来很赞,很多比赛选手也热衷于在比赛后期去找使用不同模型的队友进行模型融合,但真实工业中,还是Less is better。例如:在2006年,Netflix组织的第一场数据科学竞赛,队伍Korbell以8.43%的提升获得了第一进步奖,为此,他们融合了107个算法且耗时2000小时。由于融合带来的复杂度,最后Netflix并没有将他们方案完全应用在产品中 [7]。现在很多比赛平台也声明禁止选手过多堆砌模型,特别是很多比赛已经开始将预测时间加入分数评估中。对于我们来说,模型融合是一种提升分数的有力技巧,但还是建议平衡好整个解决方案的准确率和效率。

参考资料

[1] 《KAGGLE ENSEMBLING GUIDE》- MLWave: [https://mlwave.com/kaggle-ensembling-guide/](https://mlwave.com/kaggle-ensembling-guide/)

[2] 《机器学习》- 周志华

[3] 招商银行的消费金融场景下的用户购买预测的冠军方案: [https://github.com/sunwantong/China-Merchants-Bank-credit-card-Cente-User-purchase-forecast](https://github.com/sunwantong/China-Merchants-Bank-credit-card-Cente-User-purchase-forecast)

[4] 《天池新人赛:贷款违约预测TOP6方案分享》- 曹欢 (Coggle小组成员)

[5] Sill, J., Takács, G., Mackey, L., & Lin, D. (2009). Feature-weighted linear stacking. arXiv preprint arXiv:0911.0460.

[6] T-SNE+Stacking:[https://www.kaggle.com/c/otto-group-product-classification-challenge/discussion/14295](https://www.kaggle.com/c/otto-group-product-classification-challenge/discussion/14295)

[7] Netflix Recommendations: Beyond the 5 stars (Part 1): [https://netflixtechblog.com/netflix-recommendations-beyond-the-5-stars-part-1-55838468f429](https://netflixtechblog.com/netflix-recommendations-beyond-the-5-stars-part-1-55838468f429)

干货学习,三连

多模型融合推荐算法

常见的多模型融合算法多模型融合算法可以比单一模型算法有极为明显的效果提升。但是怎样进行有效的融合,充分发挥各个算法的长处?这里总结一些常见的融合方法: 1.线性加权融合法线性加权是最简单易用的融合算法... 查看详情

数据竞赛总结

...布和内容;特征工程目的是从数据中抽取出有效的特征;模型训练与验证部分包括数据划分的方法以及数据训练的方法;模型融合参考我的另一篇介绍模型融合的博客。1.1.数据分析在拿到数据之后,首先要做的就是要数据分析(E... 查看详情

多目标建模总结

...建模,多目标建模的常用方法主要可以分为:多模型的融合多任务学习底层共享表示的优化任务序列依赖关系建模多模型的融合是根据不同的指标训练不同的模型,最终 查看详情

wpf这可能是全网最全的拖拽实现方法的总结

原文:【WPF】这可能是全网最全的拖拽实现方法的总结前文本文只对笔者学习掌握的一般的拖动问题的实现方法进行整理和讨论,包括窗口、控件等内容的拖动。希望本文能对一些寻找此问题的解决方法的人和一些刚入门的人一... 查看详情

最全前端问题及答案总结[转]

...浏览器内核差异、兼容性、hack、CSS基本功:布局、盒子模型、选择器优先级及使用、HTML5、CSS3、移动端适应。JavaScript:数据类型、面向对象、继承、闭包、插件、作用域、跨域、原型链、模块化、自定义事件、内存泄漏、事件... 查看详情

爆肝一周总结最全javascriptarray方法详解(代码片段)

...程是考验Coder对Array是否熟练以及在何种场景下使用哪种方法处理最优。小编,在最近开发中就遇到了Array问题,在处理复杂的业务需求时,没想到Array有类似的方法,然后将方法组合起来解决当下问题。文章用下班时间肝了一周... 查看详情

多目标建模总结

...建模,多目标建模的常用方法主要可以分为:多模型的融合多任务学习底层共享表示的优化任务序列依赖关系建模多模型的融合是根据不同的指标训练不同的模型,最终对多个模型的结果做融合;多任务学习是目... 查看详情

史上最全的测试用例设计方法总结(代码片段)

测试用例的设计方法(全)等价类划分方法:一.方法简介1.定义是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒... 查看详情

tensorflow中一种融合多个模型的方法(代码片段)

1.使用场景假设我们有训练好的模型A,B,C,我们希望使用A,B,C中的部分或者全部变量,合成为一个模型D,用于初始化或其他目的,就需要融合多个模型的方法 2.如何实现我们可以先声明模型D,再创建多个Saver实例,分别从模型... 查看详情

zillow中模型融合的方法及其代码(代码片段)

...视频)相关的机器学习方法研究,会涉及很多特征、分类模型(分类任务)的选择。以声音识别为例,常见的特征有MFCC、LPCC、spectrogram-likefeatures等,分类模型就很多了,有传统的分类模型SVM、KNN、RandomForest,还有现在比较火的... 查看详情

wpf这可能是全网最全的拖拽实现方法的总结

前文本文只对笔者学习掌握的一般的拖动问题的实现方法进行整理和讨论,包括窗口、控件等内容的拖动。希望本文能对一些寻找此问题的解决方法的人和一些刚入门的人一些帮助。笔者为WPF初学者,能得到各位的批评指正也是... 查看详情

深度学习最全优化方法总结比较(sgd,adagrad,adadelta,adam,adamax,nadam)

...(标题不能再中二了)本文仅对一些常见的优化方法进行直观介绍和简单的比较,各种优化方法的详细内容及公式只好去认真啃论文了,在此我就不赘述了。SGD此处的SGD指mini-batchgradientdescent,关于batchgradientdes... 查看详情

模型融合

结合/融合/整合(integration/combination/fusion)多个机器学习模型往往可以提高整体的预测能力。这是一种非常有效的提升手段,在多分类器系统(multi-classifiersystem)和集成学习(ensemblelearning)中,融合都是最重要的一个步骤。 举个实... 查看详情

找圆方法的总结和比较(三种主要识别方法的比较和融合)(代码片段)

...上,本节的重点在于如果将每一种算法找到的目标有效地融合起来,并且进一步横向分析研究算法间的关系,最后就整套算法创造过程中产生的思考进行联想和畅谈,希望多少能够给关注这个方向、有类似需求的创作者一些思考... 查看详情

splice方法最详细最全面的解释!!!(代码片段)

文章目录前言一、splice方法官方文档节选二、根据文档测试方法一:方法二:方法三:方法四:总结前言在学前端的时候一直对splice方法不太清楚,今天特意总结了一下!一、splice方法官方文档节选查阅了... 查看详情

splice方法最详细最全面的解释!!!(代码片段)

文章目录前言一、splice方法官方文档节选二、根据文档测试方法一:方法二:方法三:方法四:总结前言在学前端的时候一直对splice方法不太清楚,今天特意总结了一下!一、splice方法官方文档节选查阅了... 查看详情

关于融合模型的一些简单整理(stackingblending)

目前,模型融合的方式有很多,比较常用的包括Voting法、Stacking法以及Blending法。一、VotingVoting是模型融合策略中最简单的一种方法,其融合过程不需要建立新的模型,只需要在单一模型的输出结果上完成融合。Vot... 查看详情

关于融合模型的一些简单整理(stackingblending)

目前,模型融合的方式有很多,比较常用的包括Voting法、Stacking法以及Blending法。一、VotingVoting是模型融合策略中最简单的一种方法,其融合过程不需要建立新的模型,只需要在单一模型的输出结果上完成融合。Vot... 查看详情