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