13.2 小节介绍过一种叫做 Voting Classifier 集成学习的方法。这种方法的思路非常简单,比如有三个模型,将数据集在每一个模型上进行预测,最后综合三个模型的结果。
- 对于分类任务,最后的分类结果使用少数服从多数的原则;
- 对于回归任务,最后的回归值可以取平均值。
Stacking 是另外一种集成学习方法。比如还是三个模型,对于 Stacking 方法来说,依然是将数据集分别在三个模型上进行预测,然后我们将这三个模型的预测结果作为新添加模型的输入(Voting Classifier 是将三个模型的结果直接综合考虑),将这个新添加模型的输出作为最终的预测结果。
训练 Stacking
了解了 Stacking 集成学习方法,那要如何训练一个 Stacking 集成学习的分类器呢?首先我们先将我们的训练数据集划分成两份:
- 第一份数据集用来训练底层的三个模型;
- 第二份数据集用来训练第二层的第四个模型。
首先使用第一份数据集分别将底层的三个模型训练好,将第二份数据集输入到训练好的三个模型中,得到的输出结果和第二份数据集的标签构成一个新的数据集,最后用新的数据集来训练第二层上的第四个模型,最终形成 Stacking 集成学习的模型。
根据上面的训练方法,我们可以构建出更加复杂的 Stacking 模型。比如下图堆叠了三层。
第一层三个模型的输出作为第二层三个模型的输入,将第二层的三个模型的输出作为第三层模型的输入。
前面训练两层的 Stacking 模型需要将数据集划分为两份。训练三层的 Stacking 模型需要将数据集划分为三份。
- 第一份数据集用于训练第一层的三个模型;
- 第二份数据集用于训练第二层的三个模型;
- 第三份数据集用于训练第三层的最后一个模型。
这也能够看出来,Stacking 中的层数和每层中的模型个数都是一个超参数。正因为如此,Stacking 这种集成学习模型可能会很复杂,所以 Stacking 非常容易过拟合。
这种 Stacking 堆叠层的方法与神经网络非常相似,只不过对于神经网络而言,每一个神经元不是一个全新的算法模型,而是计算一个函数的值。加深层数的神经网络被称为深度学习,层数越多虽然会增强网络的表达能力,但是也会引发很多问题,这其中就包括和 Stacking 相似的过拟合问题。
Sklearn 实现 Stacking
Sklearn 中并没有提供 Stacking 集成学习的接口。
References: Python3入门机器学习 经典算法与应用: https://coding.imooc.com/class/chapter/169.html#Anchor