Stacking
Stacking是通过多个基学习器集成学习从而降低了方差。这里跟Bagging的思想有点类似,但是还是有点小不一样,因为我们的基学习器不仅仅仅限于一颗颗单独的树模型,而是多个不同类别的模型,如随机森林,GBDT,MLP等。
对于输入,Stacking和Bagging一样,同样的数据输入进来,然后每个模型都在原始的数据上进行训练。
- Bagging因为有Bootstrap的存在,所以每个基模型都是在不同采样的数据集上做训练;而对于Stacking来说,是在同一份数据集训练不一样的模型。
对于输出:
-
Bagging的输出结果是众多决策树的结果做平均或投票,这是因为每个模型的种类都一样,所以它们的输出都是处于同一分布或scale;但是对于Stacking来说,因为我们使用的模型种类都不一样,从而每个输出的结果都不一样,所以我们的做法就是把每个模型的输出都concat起来,假设你有N个模型,那么你就会得到一样长度为N的向量,然后我们再把它做一个线性的组合,最后输出。
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的特性一样,同一份数据经过了多次训练,都是为了不断逼近真实结果,但与此同时,也容易把噪音数据给加强学习。
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} M∗KN∗K大小的矩阵。紧接着把第1层的结果输入到第2层的(多个学习器)或者一个简单的线性层进行训练即可。需要注意的是,我们第1层预测得到的样本都是没有参与过训练的,避免了数据过分地“炒饭”。
- 以上都是训练的过程,那么对于预测过程也差不多如此:我们将第1层训练好N*K个模型对test_data进行预测并平均,得到 N ∗ K K \frac{N*K}{K} KN∗K个预测结果,然后把它们放到第2层训练好的模型再进行预测得到我们最终的结果。
Summary
- Stacking是结合了多个不同种类的学习器进行训练,能够有效地降低方差。
- 多层Stacking是结合了多层(不同种类学习器)进行训练,从而降低偏差,但是容易过拟合。
- Repeated K-Fold Stacking是通过K折交叉验证的思想,有效地缓解了多层Stacking带来的过拟合。
- Stacking的思想在竞赛中经常被使用,它能有效地提高精度,从而达到一个很好的结果;但是也有个较为明显的缺点,就是在时间消耗上有较大的代价。