机器学习基础-Stacking

Stacking

Stacking是通过多个基学习器集成学习从而降低了方差。这里跟Bagging的思想有点类似,但是还是有点小不一样,因为我们的基学习器不仅仅仅限于一颗颗单独的树模型,而是多个不同类别的模型,如随机森林,GBDT,MLP等。

对于输入,Stacking和Bagging一样,同样的数据输入进来,然后每个模型都在原始的数据上进行训练。

  • Bagging因为有Bootstrap的存在,所以每个基模型都是在不同采样的数据集上做训练;而对于Stacking来说,是在同一份数据集训练不一样的模型。

对于输出:

  • Bagging的输出结果是众多决策树的结果做平均或投票,这是因为每个模型的种类都一样,所以它们的输出都是处于同一分布或scale;但是对于Stacking来说,因为我们使用的模型种类都不一样,从而每个输出的结果都不一样,所以我们的做法就是把每个模型的输出都concat起来,假设你有N个模型,那么你就会得到一样长度为N的向量,然后我们再把它做一个线性的组合,最后输出。

    机器学习基础-Stacking_第1张图片

Multi-layer Stacking

前面我们提到Stacking可以有限的降低方差,那么还缺一个偏差的维度。这时候我们可以使用多层Stacking去降低偏差。

所谓多层Stacking,就如同其字面意思去理解,我们由原本的1层集成学习变成了2层(如下图所示), 就好比神经网络的hidden_layer,由原本的1层网络深度加大到2层。

具体的训练过程:

  • 首先也是数据输入到不同种类的模型进行训练,然后将训练得到的结果再输入到不同的模型里面进行训练,这时第1层的输出结果已经跟我们的结果很相近了,所以在第2层中训练起来就显得更加容易,而且我们还能在该层,把第1层模型没有学好的地方再捡起来加强学习,这里就有点类似GBDT学习残差的思想,不过本意都旨在降低偏差,提高精度。

  • 在第2层训练的时候,除了我们将第1层的输出作为输入,还可以将第1层的原始数据拼接在一起。比如你的原始数据是一个长为P的向量作为输入,而第1层的输出是由N个模型得到的,那么第2层的输入就为一个长为P + N的向量。

  • 需要注意的是,多层的Stacking特别容易过拟合,如GBDT的特性一样,同一份数据经过了多次训练,都是为了不断逼近真实结果,但与此同时,也容易把噪音数据给加强学习。

    机器学习基础-Stacking_第2张图片

Repeated K-Fold Bagging

对于多层Stacking的过拟合现象,有人提出训练过程中的第1层和第2层应该使用不同的数据,简单来说就是把训练集分为 a b两块,第1层的模型现在a上面训练好,然后拿训练好的模型在b上面做预测,接着把预测结果作为第2层的输入并训练。

为此,提出了Repeated K-Fold Bagging,即多次K折交叉验证:

  • 首先把原始数据进行多个模型的K折交叉验证,即拿(K-1)份数据进行训练,拿1份数据进行预测,然后把预测得到的结果做平均拼接起来,就会得到一个和原始数据样本数一样多的样本
  • 假设在第1层,我们原始由M个样本,经过N个模型的K折交叉验证,那么我们就会得到一个 M ∗ N ∗ K K M*\frac{N*K}{K} MKNK大小的矩阵。紧接着把第1层的结果输入到第2层的(多个学习器)或者一个简单的线性层进行训练即可。需要注意的是,我们第1层预测得到的样本都是没有参与过训练的,避免了数据过分地“炒饭”。
  • 以上都是训练的过程,那么对于预测过程也差不多如此:我们将第1层训练好N*K个模型对test_data进行预测并平均,得到 N ∗ K K \frac{N*K}{K} KNK个预测结果,然后把它们放到第2层训练好的模型再进行预测得到我们最终的结果。

Summary

  • Stacking是结合了多个不同种类的学习器进行训练,能够有效地降低方差。
  • 多层Stacking是结合了多层(不同种类学习器)进行训练,从而降低偏差,但是容易过拟合。
  • Repeated K-Fold Stacking是通过K折交叉验证的思想,有效地缓解了多层Stacking带来的过拟合。
  • Stacking的思想在竞赛中经常被使用,它能有效地提高精度,从而达到一个很好的结果;但是也有个较为明显的缺点,就是在时间消耗上有较大的代价。

你可能感兴趣的:(机器学习基础,机器学习,集成学习,人工智能)