翻到之前自己写的这篇博客,感觉写的还是不够简洁明了,特地回来改一下,顺便文末附上Kaggle内相关操作的代码,希望能够帮助学习的同学能够瞬间理解stacking这个概念。

stacking:stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为特征加入训练集进行再训练,从而得到完整的stacking模型。stacking的方法在各大数据挖掘比赛上都很风靡,模型融合之后能够小幅度的提高模型的预测准确度。

stacking详解:

借用拍拍贷风控比赛几位大神这张模型融合的例子,来讲解一下。其中的第三模块,预测M3数据就是一个stacking的过程。

 

详解stacking过程

  • 第一层:我们采用RF、ET、GBDT、XGB四种模型,分别对训练样本进行预测,然后将预测结果作为下一层的训练样本。

具体训练过程:

  1. 划分training data为K折,为各个模型的训练打下基础;
  2. 针对各个模型RF、ET、GBDT、XGB,分别进行K次训练,每次训练保留K分之一的样本用作训练时的检验,训练完成后对testing data进行预测,一个模型会对应5个预测结果,将这5个结果取平均;
  3. 最后分别得到四个模型运行5次之后的平均值,同时拼接每一系列模型对训练数据集的预测结果带入下一层;

图解:

详解stacking过程

举例:比如针对第一个模型RF,我们先将数据集划分成5折,1,2,3,4,5。步骤如下:

  1. 保留2,3,4,5训练,用1做测试数据(查看当前训练的效果,可配合early stop)记录下该折测试数据的预测结果,同时预测testing data(此处的testing data就是我们要最终提交结果的那部分数据);
  2. 保留1,3,4,5训练,用2做测试数据并记录下该折测试数据的预测结果,预测testing data;
  3. 保留1,2,4,5训练,用3做测试数据并记录下该折测试数据的预测结果,预测testing data;
  4. 保留1,2,3,5训练,用4做测试数据并记录下该折测试数据的预测结果,预测testing data;
  5. 保留1,2,3,4训练,用5做测试数据并记录下该折测试数据的预测结果,预测testing data;
  6. 训练五轮之后得到针对testing data的五个预测值,取平均值,同时拼接每一系列模型对训练数据集的预测结果;

接下来再用同样的方法训练ET、GBDT、XGB,注意保持K折数据的一致!全部训练完成之后,将得到的四个预测结果带入下一层预测。

  • 第二层:将上一层的四个结果带入新的模型,进行训练再预测。第二层的模型一般为了防止过拟合会采用简单的模型。

具体训练过程:将四个预测结果,拼接上各个样本的真实label,带入模型进行训练,最终再预测得到的结果就是stacking融合之后的最终预测结果了。

以上即为stacking的完整步骤!

Blending大体与stacking类似,只是将Kfold CV改为了 HoldOut CV,也就是原来Kfold CV是等距划分训练集,HoldOut CV根据自己定义的百分比进行训练集测试集的划分。

为方便理解,附上Kaggle stacking代码:https://www.kaggle.com/arthurtok/introduction-to-ensembling-stacking-in-python