转载自 https://mp.weixin.qq.com/s/-MbiSkgkF11gt5t9W0ExTw

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

    2022-01-05-[ML]-模型融合方法总结-转载 - 图1

    一、背景

    之前有段时间打数据挖掘类比赛,看到很多选手用模型融合的技巧,特别是比赛后期的时候,很多选手开始找队友,多数是为了融模型。虽然我也有尝试过一些模型融合,但却一直缺乏体系化了解,所以在看了荷兰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) 算术平均法
    image.png
    (2) 几何平均法
    image.png
    (3) 加权平均法
    image.png
    几何平均法受极端值的影响较算术平均法小。另外,关于加权平均法的权重,也可以人工主观或根据模型分数来设置。同时也建议尽量平均差异性小的模型们。

    3. 排序法

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

    2022-01-05-[ML]-模型融合方法总结-转载 - 图5

    图1:算术平均法样例

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

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

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

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

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

    2022-01-05-[ML]-模型融合方法总结-转载 - 图6

    图2:排序平均法样例

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

    • 重新排序:将新样本放入原测试集中,重新排序,一旦数据量大,时间复杂度会增加。
    • 参考历史排序:先将历史测试集的预测结果和排序结果保存,新样本进来后,在历史测试集中找到与新样本预测值最近的值,然后取其排序号赋予新样本。之后平均排序,使用历史最大最小值进行归一化操作即可。

    4. Stacking

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

    Stacking主要分为以下三类:

    • 单层Stacking
    • 多层Stacking
    • 其它技术与Stacking的结合

    (1) 单层Stacking

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

    2022-01-05-[ML]-模型融合方法总结-转载 - 图7

    图3:单层Stacking结构示意图

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

    2022-01-05-[ML]-模型融合方法总结-转载 - 图8

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

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

    2022-01-05-[ML]-模型融合方法总结-转载 - 图9

    图5:暴力单层Stacking [1]

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

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

    (2) 多层Stacking

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

    2022-01-05-[ML]-模型融合方法总结-转载 - 图10

    图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的示意图如下所示:

    2022-01-05-[ML]-模型融合方法总结-转载 - 图11

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

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

    四、总结

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