Stacking

Table of Contents

1. Stacking 简介

Stacking 是一种集成学习(Ensemble Learning)方法,它于 1992 年由 David H. Wolpert 提出。

2. Stacking 算法

Stacking 先从初始数据集训练出“初级学习器”,然后“生成”一个新数据集用于训练“次级学习器”(也称为“元学习器,meta-learner”)。 在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记。

Stacking 的算法描述如图 1 所示。Stacking 的初级学习器可以是任意分类器,次级学习器一般使用 Multi-response linear regression ,次级学习器的输出作为整个学习器的输出。

stacking.jpg

Figure 1: Stacking 算法

比如,有下面训练数据: \(\boldsymbol{x_1}; y_1, \boldsymbol{x_2}; y_2, \boldsymbol{x_3}; y_3, \boldsymbol{x_4}; y_4, \boldsymbol{x_5}; y_5, \boldsymbol{x_6}; y_6\) ,其中 \(y_1, y_2, y_3, y_4, y_5, y_6\) 是对应数据的标签。

假设共有两个初级学习器,第 1 个初级学习器 \(\mathcal{L}_1\) 对 6 个训练数据的实际输出为 \(z_{11}, z_{21}, z_{31}, z_{41}, z_{51}, z_{61}\) ;第 2 个初级学习器 \(\mathcal{L}_2\) 对 6 个训练数据的实际输出为 \(z_{12}, z_{22}, z_{32}, z_{42}, z_{52}, z_{62}\) 。则我们用下面数据作为次级学习器的训练数据:
\[\begin{gathered} (z_{11}, z_{12}); y_1 \\ (z_{21}, z_{22}); y_2 \\ (z_{31}, z_{32}); y_3 \\ (z_{41}, z_{42}); y_4 \\ (z_{51}, z_{52}); y_5 \\ (z_{61}, z_{62}); y_6 \end{gathered}\]

2.1. 防止过拟合

在训练阶段,次级学习器的训练数据由初级学习器产生,若直接用初级学习器的训练集来产生次级训练集,则过拟合的风险会比较大;因此,一般是通过使用交叉验证或留一手(Hold-Out)这样的方式, 用训练初级学习器未使用的样本产生次级学习器的训练样本。

比如,在前面介绍的例子中,第 1 个初级学习器 \(\mathcal{L}_1\) 对 6 个训练数据的实际输出为 \(z_{11}, z_{21}, z_{31}, z_{41}, z_{51}, z_{61}\) 。得到它们时,要注意下面事项:获得得到 \(\boldsymbol{x_1}\) 的输出 \(z_{11}\) 时,不能拿数据 \(\boldsymbol{x_1}; y_1\) 来训练,因为这太容易过拟合了。所以我们要排除 \(\boldsymbol{x_1}; y_1\) ,即拿数据 \(\boldsymbol{x_2}; y_2, \boldsymbol{x_3}; y_3, \boldsymbol{x_4}; y_4, \boldsymbol{x_5}; y_5, \boldsymbol{x_6}; y_6\) 训练得到的模型来得到 \(\boldsymbol{x_1}\) 的输出 \(z_{11}\) 。类似地,要排除 \(\boldsymbol{x_2}; y_2\) ,即拿数据 \(\boldsymbol{x_1}; y_1, \boldsymbol{x_3}; y_3, \boldsymbol{x_4}; y_4, \boldsymbol{x_5}; y_5, \boldsymbol{x_6}; y_6\) 训练得到的模型来得到 \(\boldsymbol{x_2}\) 的输出 \(z_{21}\) ,其它依此类推,且对于第 2 个初级学习器 \(\mathcal{L}_2\) 也有类似的要求。

3. 参考

《机器学习,周志华,2016》,8.4.3,学习法

Author: cig01

Created: <2017-08-26 Sat>

Last updated: <2017-12-17 Sun>

Creator: Emacs 27.1 (Org mode 9.4)