写在最前:在做比赛的过程中接触到stacking方法,由于对stacking不熟悉,使用stacking时踩了不少坑,写下这篇博客,在巩固知识的同时也希望给想使用stacking方法的跟我一样的初学者一点小小的帮助。

一、stacking方法是什么

stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为训练集进行再训练,从而得到完整的stacking模型。

二、如何构造stacking模型
以两层stacking模型为例,要得到stacking模型,关键在于如何构造第二层的特征(下记为元特征,meta
feature),构造元特征的原则是尽可能的避免信息泄露,因此对原始训练集常常采用类似于K折交叉验证的划分方法。
以5折划分为例,我们将原始训练集分为5折,分别记为fold1、fold2、fold3、fold4和fold5。此时我们使用fold2-fold5的数据来训练基模型1,并对fold1进行预测,该预测值即作为基模型1对fold1生成的元特征;同样地,使用fold1、fold3-fold5的数据来训练基模型1,并对fold2进行预测,该预测值即作为基模型1对fold2生成的元特征;以此类推,得到基模型1对整个原始训练集生成的元特征。同样地,对其他基模型也采用相同的方法生成元特征,从而构成用于第二层模型(下记为元模型,meta
model)训练的完整元特征集。对于测试集,我们可以在每次基模型训练好时预测,再将预测值做均值处理;也可以将基模型拟合全部的训练集之后再对测试集进行预测。
需要注意的是,在生成第二层特征的时候,各个基模型要采用相同的Kfold,这样得到的元特征的每一折(对应于之前的K折划分)都将不会泄露进该折数据的目标值信息
,从而尽可能的降低过拟合的风险。虽然如此,实际上我们得到的元特征还是存在一定程度上的信息泄露,比如我们在预测第二折的时候,是利用了第一折的目标值信息用于训练基模型的,也就是说第一折的目标值信息杂糅在对第二折进行预测的基模型里。但是,实践中,这种程度的信息泄露所造成的过拟合程度很小。

三、如何对stacking模型调参

stacking模型调参包括对基模型和元模型进行调参。对于基模型,因为我们在生成元特征的时候要使用相同的K折划分,所以我们使用交叉验证+网格搜索来调参时最好使用与生成元特征相同的Kfold。对于元模型的调参,使用交叉验证+网格搜索来调参时,为了降低过拟合的风险,我们最好也使用与元特征生成时同样的Kfold。
综上,stacking方法从一开始就得确定一个Kfold,这个Kfold将伴随对基模型的调参、生成元特征以及对元模型的调参,贯穿整个stacking流程。当然,由于我们生成基模型时未使用全部数据,我们可以使用多个不同的Kfold来生成多个stacking模型然后进行加权,这样可以进一步提高算法的鲁棒性。
另外,基模型的选择需要考虑的是:基模型之间的相关性要尽量小,同时基模型之间的性能表现不能差距太大。



参考文献

1、A Kaggler's Guide to Model Stacking in Practice
<http://blog.kaggle.com/2016/12/27/a-kagglers-guide-to-model-stacking-in-practice/>



2、数据比赛大杀器----模型融合(stacking&blending)
<http://blog.csdn.net/u014356002/article/details/54376138>

3、为什么做stacking ensemble的时候需要固定k-fold?
<https://www.zhihu.com/question/61467937/answer/188191424>