Stacking:集成学习策略图解

Stacking 是机器学习中,集成学习的一种方法。集成的好处是不同的模型可以学习到数据的不同特征,经过融合后的结果往往能有更好的表现,大有取长补短的意思。

  • 基本理解

这种方法的思想比较简单,在不知道它之前,我们可能在设计算法的时候就会想到这种结构了,下面是我对这个算法的理解: 

Stacking:集成学习策略图解_第1张图片

 这个结构我们都很熟悉,十分像神经网络中上层神经元到它的一个下层神经元的结构。如果按这种方法,x1-x4是上层的权重,e1是这个神经元的激活函数,并输出神经元的值。不同的是,对于每个x1-x4,输入都是一样的。

而对于集成学习来说,我们只需要把关键的x1 - x4 以及 e1 换成模型就好了。换句话说,最终整个模型的流程如下:

Stacking:集成学习策略图解_第2张图片

即将所有数据使用n个模型进行预测,再将预测的结果取平均值,作为特征值输入给第n+1个模型,最终的输出由Model(n+1)决定。

  • 模型选择

可以看到,Stacking的结构在构成上就已经非常复杂(因为我们在图中过滤了每个model的内部结构),那么当我们真正使用这个结构的时候,是如何进行训练的正常运行,保证结构的合理性而不会过拟合呢。这一部分参考了许多网上的资料,包括知乎、CSDN和其他的博客园的内容,大家都是相互引用,我就不一一引用了哈。

在这里我们首先分步考虑每个模型的训练过程:

对于Model1 - Model n,他们是第一层的模型,普遍来讲,我们可以选择的有:

第一层模型: 

  • Xgboost
  • LightGBM
  • RandomForest
  • GBDT
  • ExtraTrees
  • ...

这里可以看出,第一层的模型都是强模型,至于为什么,可以从几个方面考虑:

  1. 最简单的思想就是马后炮,如果第一层使用了一个弱模型,则整个模型的表现会被大大影响,准确率大打折扣。
  2. 当然光是马后炮是不管用的,首先,我们考虑我们对第一层模型的需求,因为Stacking的思想是取长补短,而不同的强模型对于相同的数据以及数据分布都是从不同的角度出发的,所以我们需要不同角度的数据进行汇总和学习,获得更好的结果。
  3. 结合上面两点,我们对第一层的模型要求应该是:效果准确,结构不同。所以我们应当选择的是结构不同的强模型。

另外,是否使用Stacking也有几点需要注意:

  1. 数据集是否够大。stacking不一定对极小的数据集有效,这与它的训练过程有关,如果一共就200个数据,在训练过程中就要首先分为训练集和测试集,所有训练集又要分为n-fold,导致每个fold可能就只有20个数据,最终结果是无法保证效果的。
  2. 第一层的model数要够多。为什么要够多呢,这里主要是考虑第二层模型的训练问题,Stacking精巧的训练过程需要将第一层的model输出合并为第二层的model_(n+1)的输入,即第一层的model数N决定了第二层model_(n+1)的输入特征维数,如果想要第二层得到充分训练,那么N的维数取1或者2肯定是不够的。(如下图所示)

    Stacking:集成学习策略图解_第3张图片

  3. 从知乎转:理论上看,通用的stacking模型已经证明其集成结果应该“渐进等价”第一层中的最优子模型,所以stacking的结果不应该有大幅度的下降。换句话说,如果你用了stacking,效果变差了,就优先考虑上面两条,然后再好好检查下自己的第一层model中有没有效果很差的model拉低了整体的表现。

那么到这里基本搞定了第一层的模型选择,我们再看第二层。说是第二层,其实就是一个model_(n+1)。对于这一层的算法,我觉得可以有很多不同的理解:

  • 可以认为是第一层做的是特征变换,第二层做的才是结果预测;
  • 也可以认为第一层是各个模型进行预测,第二层进行结果筛选;
  • 或者第一层是模型预测,第二层是置信度的打分和加权平均。

但无论如何第二层做的计算一定是决定如何输出结果的,因为第一层的模型其实已经十分好了(强模型),在第二层,我们应该使用的是较为简单的模型,所以这里我们有一个非常普遍的选择,就是:LR模型,Linear Regression。当然这个选择也不绝对,可以使用不同的模型进行最后的输出决策,但是这个模型最好是简单的模型,以防止整体模型的过拟合。

对于LR模型,下篇博客再好好介绍一下。这里,我们就先看下整体模型是如何进行训练的。

  • 训练过程

突然意识到应该先写训练过程再写模型选择的,会更好理解。但是也没有无妨,如果你理解了上面的内容,那下面的过程一看就会明白。

首先我们需要知道机器学习中 K-Fold 的训练过程是怎样的,即把一个数据集分为K份,再将每一份作为测试集,其余作为训练集,训练K次,最终的结果的准确度或取值是这K次结果的均值,一张图表达:

Stacking:集成学习策略图解_第4张图片

而在Stacking中,每个model都会做一个K-Fold预测,那么Stacking的训练过程也就变为了:

Stacking:集成学习策略图解_第5张图片

可以看到,第一层模型经过K-Fold 训练后得到的所有数据连在一起,成为了Model_(n+1)的训练集。

但不难发现的是,Model_(n+1)只有训练集,没有测试集。因为K-fold中每个测试集的结果都变成了Model_(n+1)的训练集。所以在最最最最最最开始,我们就需要将整体数据分为测试集和训练集。那么最终,Stacking的整体结构为:

Stacking:集成学习策略图解_第6张图片

到此,Stacking的结构就结束了,具体如何用代码实现,是一个很枯燥难顶的过程,因为我是使用Stacking做回归,所以如果完成,会把实现代码贴上来。

完结!

你可能感兴趣的:(Machine,Learning,Stacking,集成学习,K-Fold)