机器学习算法笔记(三十九):Stacking

继上文的 Bagging 和 Boosting 之后,本文再讨论一种集成学习的思路——Stacking。

之前讨论的 Voting Classifier中,若我们有三个算法,每个算法都对数据进行预测,我们通常综合这三个算法的结果:对于分类问题少数服从多数、对于回归问题取平均值。 Stacking 则是另外一种思路:首先也是使用三个算法计算预测值,但我们不直接使用这三个结果综合,而是把它们作为输入再训练一个新模型,把这个新模型的输出作为最终结果。Stacking 这个名字也非常形象——我们多了一个模型,这个模型落在了这三个模型之上,“落”这个动作就是 Stacking 的意义。

Stacking 过程示意图

虽然上图解决的是一个回归问题,但也同样可以用来解决分类问题——输入的数值变为分为某一类的概率即可。

那我们如何训练一个 Stacking 分类器呢?我们要做的就是先把训练数据集分成两份,对于其中的一份用来训练三个模型,对于另外一份用来训练 Stacking 的那个新模型(图中的 Blending)。首先使用第一份训练集分别把开始的三个模型训练好,对于第二部分的样本,就能直接扔进训练好的这三个模型中,获得输出结果,这些输出结果和第二份训练集中的真值就形成了新的数据集,用这个新的数据集就能训练第四个模型,最终形成 Stacking 整体的集成学习模型。

Stacking 训练过程示意图

这样做之后我们也可以构造出更为复杂的 Stacking 模型,如下图所示,我们可以类似神经网络一样构造出多个层级,下一层的输入为上一层三个模型的输出进行设计。

更为复杂的 Stacking 示意图

上图的逻辑思想与神经网络十分类似,只不过对应神经网络来说,每一个神经元不是一个全新的算法,而只是计算一个函数的值;相应的,对应神经网络来说,如果层数增多的话就达到了深度学习的模型。神经网络因其灵活度较高,容易出现过拟合,很多深度学习的话题,其本质就是在探讨如何解决一个复杂网络的过拟合问题,其中很多的方法也使用于 Stacking 集成学习算法。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注