其他机器学习系列文章见于专题:机器学习进阶之路——学习笔记整理,欢迎大家关注。
1. Stacking定义
Stacking并不是简单地对个体学习器的结果做简单逻辑处理,而是先从初始数据集训练出初级学习器,将初级学习器的输出当成特征,初始样本的标记仍被当作标记,由此生成一个新数据集用于训练学习器。
2. Stacking原理
假设我们有两个初级学习器 M o d e l 1 Model1 Model1, M o d e l 2 Model2 Model2。
(1)对初级学习器 M o d e l 1 Model1 Model1,利用训练集 D D D进行训练,然后用训练好的 M o d e l 1 Model1 Model1预测训练集 D D D和测试集 T T T的标签列,结果分别为 P 1 P1 P1、 T 1 T1 T1。
(2)对初级学习器 M o d e l 2 Model2 Model2,重复步骤(1),得到预测标签结果 P 2 P2 P2、 T 2 T2 T2。
(3)将两个初级学习器的结果合并,得到次级学习器 M o d e l 3 Model3 Model3的训练集 P 3 = ( P 1 , P 2 ) P3=(P1, P2) P3=(P1,P2)和测试集 T 3 = ( T 1 , T 2 ) T3=(T1, T2) T3=(T1,T2)。也就是说,有多少个初级学习器,次级学习器的训练集和测试集就有多少列(特征)。
(4)用 P 3 P3 P3训练次级学习器 M o d e l 3 Model3 Model3,并预测 T 3 T3 T3,得到最终的预测结果。
3. Stacking算法描述
输入:训练集 D D D,初级学习算法 L 1 , L 2 , . . . , L T {\mathfrak{L}}_1,{\mathfrak{L}}_2,...,{\mathfrak{L}}_T L1,L2,...,LT,次级学习算法 L \mathfrak{L} L。
过程:
(1)对 i = 1 , 2 , … , m {i = 1,2, \ldots ,m} i=1,2,…,m,使用初级学习算法 L t \mathfrak{L}_t Lt产生初级学习器 h t = L t ( D ) h _ { t } = \mathfrak { L } _ { t } ( D ) ht=Lt(D);
(2)生成次级训练集:
D ′ = ∅ D ^ { \prime } = \emptyset D′=∅
f o r i = 1 , 2 , … , m d o {{for\quad }i = 1,2, \ldots ,m\quad do} fori=1,2,…,mdo
f o r t = 1 , 2 , … , T d o {{for\quad }t = 1,2, \ldots ,T\quad do} fort=1,2,…,Tdo
z i t = h t ( x i ) {{z_{it}} = {h_t}\left( {{x_i}} \right)} zit=ht(xi)
e n d f o r {{ end\quad for}} endfor
D ′ = D ′ ∪ ( ( z i 1 , z i 2 , … , z i T ) , y i ) {{D^\prime } = {D^\prime } \cup \left( {\left( {{z_{i1}},{z_{i2}}, \ldots ,{z_{iT}}} \right),{y_i}} \right)} D′=D′∪((zi1,zi2,…,ziT),yi)
e n d f o r {{ end\quad for}} endfor
(3)在 D ′ {D'} D′上用次级学习算法 L \mathfrak{L} L产生次级学习器 h ′ = L ( D ′ ) {h'} = {\mathfrak{L}}\left( {D'} \right) h′=L(D′)。
输出: H ( x ) = h ′ ( h 1 ( x ) , h 2 ( x ) , … , h T ( x ) ) H\left( x \right) = h'\left( {{h_1}\left( x \right),{h_2}\left( x \right), \ldots ,{h_T}\left( x \right)} \right) H(x)=h′(h1(x),h2(x),…,hT(x))。
4. K折交叉验证
但是,上述这种做法直接利用训练集训练得到的模型去预测训练集的标签,过拟合风险比较大。因此,一般通过k折交叉验证来缓解这种做法的过拟合问题。
以5折交叉验证为例,做法如下:
(1)原始训练集 D D D被随机划分5个大小相似的子集 D 1 , D 2 , … , D 5 {D_1},{D_2}, \ldots ,{D_5} D1,D2,…,D5,令 D j D_j Dj、 D ‾ j = D \ D j {\overline D _j} = D\backslash {D_j} Dj=D\Dj分别表示第 j j j折的测试集和训练集。
(2)用 D 1 D_1 D1训练 M o d e l 1 Model1 Model1,然后在 D 1 D_1 D1上进行预测得到 P 11 P_{11} P11;用 D 2 D_2 D2训练 M o d e l 1 Model1 Model1,然后在 D 2 D_2 D2上进行预测得到 P 12 {P_{12}} P12,重复5次将预测得到的 P 1 = ( P 11 ⋮ P 15 ) P 1 = \left( \begin{array} { c } { P _ { 11 } } \\ { \vdots } \\ { P _ { 15 } } \end{array} \right) P1=⎝⎜⎛P11⋮P15⎠⎟⎞。 P 1 P1 P1的训练集样本数等于原始训练集 D D D中的样本数。
(3)在每次5折交叉验证中,都利用训练好的 M o d e l 1 Model1 Model1对整个测试集 T T T进行预测,然后将5次预测结果求平均得到 T 1 T1 T1。
(4)对初级学习器 M o d e l 2 Model2 Model2,重复步骤(2)(3),得到标签预测结果 P 2 P2 P2、 T 2 T2 T2。
(5)拼接得到次级学习器 M o d e l 3 Model3 Model3的训练集 P 3 = ( P 1 , P 2 ) P3=(P1,P2) P3=(P1,P2)和测试集 T 3 = ( T 1 , T 2 ) T3=(T1,T2) T3=(T1,T2)。
(6)用 P 3 P3 P3训练次级学习器 M o d e l 3 Model3 Model3,并预测 T 3 T3 T3,得到最终的预测结果。
参考文献:
- 《机器学习》第八章集成学习——周志华
- Kaggle机器学习之模型融合(stacked)心得
- 【机器学习】模型融合方法概述