假定已经训练出一组学习器,那么,可以由这组学习器的输出结果作为样本,再以此训练出一个学习器,这就形成了二级级联形式。
将投票视为一级,则基于投票法的算法(如,AdaBoost)也是级联。
级联集成
投票是一种常用的集成策略,另一种常见的集成策略是级联集成
Stacking算法
对于数据集
D
D
D,假定已经训练出一组学习器
h
1
,
h
2
,
⋯
,
h
T
h_1,h_2,\cdots,h_T
h1,h2,⋯,hT,那么,可以由这组学习器的输出结果作为样本,再以此训练出一个学习器,这就形成了二级级联形式。 第二级(次级)的训练如图8.1所示。
【西瓜书图8.9】所示的Stacking算法分为三大步:
(1)用训练集 D D D训练出一组学习器(初级学习器) h t h_t ht,第1-3句。
(2)用这组学习器去预测 D D D中的样本 x i \boldsymbol{x}_i xi,生成另一空间中的样本 z i \boldsymbol{z}_i zi(参见图8.1左半部分),将这个样本组装成样例 ( z i , y i ) (\boldsymbol{z}_i,y_i) (zi,yi),其中 y i y_i yi,源于原样例 ( x i , y i ) (\boldsymbol{x}_i,y_i) (xi,yi)。 则由 D D D生成了新样例集 D ′ D' D′,即第4-10句。
(3)在 D ′ D' D′上训练出一个学习器(次级学习器) h h h(参见图8.1右半部分),即第11句。
易注意到,上述算法中在各初级学习器和次级学习器中均使用同一数据集 D D D,这种反复使用会导致过拟合问题。 借助交叉验证【西瓜书第2.2.2节】的思路,我们可以解决这个问题。
设
D
=
D
1
∪
D
2
∪
⋯
∪
D
k
=
D
j
∪
D
‾
j
\begin{align} D & =D_1\cup D_2\cup \cdots \cup D_k\notag \\ & =D_j\cup \overline{D}_j \tag{8.43} \end{align}
D=D1∪D2∪⋯∪Dk=Dj∪Dj(8.43)
其中,
D
j
∩
D
i
=
∅
(
若
j
≠
i
)
D_j \cap D_i=\varnothing (\text{若}\ j\neq i)
Dj∩Di=∅(若 j=i),表明任一样本
x
\boldsymbol{x}
x在且只在某一份
D
i
D_i
Di中。
即将
D
D
D分成了大小相等的
k
k
k份,每次将其中的一份
D
j
D_j
Dj留作测试,其余的
k
−
1
k-1
k−1份
D
‾
j
\overline{D}_j
Dj用作训练。 初级训练阶段,对每个算法
L
i
\mathfrak{L}_i
Li使用
D
‾
j
,
(
j
=
1
,
2
,
⋯
,
k
)
\overline{D}_j,\ (j=1,2,\cdots,k)
Dj, (j=1,2,⋯,k)训练, 则每个算法
L
i
\mathfrak{L}_i
Li都可得到一组学习器,如表8.2所示。
对于任意的 x i \boldsymbol{x}_i xi,则必定能找到 j j j,使得 x i ∈ D j \boldsymbol{x}_i\in D_j xi∈Dj,而 x i ∉ D ‾ j \boldsymbol{x}_i\notin \overline{D}_j xi∈/Dj,这时我们取表8.2中的第 j j j列,这列的学习器都是基于 D ‾ j \overline{D}_j Dj训练得到的,即它们在训练过程中均没有用到 x i \boldsymbol{x}_i xi,将这组学习器 ( h 1 j , h 2 j , ⋯ , h T j ) (h_1^j,h_2^j,\cdots,h_T^j) (h1j,h2j,⋯,hTj)置换图8.1中的 ( h 1 , h 2 , ⋯ , h T ) (h_1,h_2,\cdots,h_T) (h1,h2,⋯,hT),再由 x i \boldsymbol{x}_i xi计算 z i \boldsymbol{z}_i zi。
这样,Stacking算法的三大步变为:
(1)用训练集 D D D训练出一初级学习器表,即表8.2。
(2)对于 D D D中的每个样本 x i \boldsymbol{x}_i xi,在表8.2中选取未使用它的列,作为初级学习器组,样本 x i \boldsymbol{x}_i xi输入这组初级学习器,生成另一空间中的样本 z i \boldsymbol{z}_i zi(参见图图8.1左半部分),将这个样本组装成样例 ( z i , y i ) (\boldsymbol{z}_i,y_i) (zi,yi),其中 y i y_i yi,源于原样例 ( x i , y i ) (\boldsymbol{x}_i,y_i) (xi,yi)。 则由 D D D生成了 D ′ D' D′。
(3)在 D ′ D' D′上训练出一个学习器(次级学习器) h h h(参见图8.1右半部分)。
为避免频繁置换初级学习器组,实际上是采用批量方式(逐列学习器组对应样本组),即将表8.2的“依行处理”改为“依列处理”,上述第(2)步优化为:
- 处理表8.2中第1列,即以 D ‾ 1 \overline{D}_1 D1训练出一初级学习器组,以该组处理 D 1 D_1 D1的样例得到对应的新样例;
- 处理表8.2中第2列,即以 D ‾ 2 \overline{D}_2 D2训练出一初级学习器组,以该组处理 D 2 D_2 D2的样例得到对应的新样例;
- ⋯ ⋯ \cdots\cdots ⋯⋯
- 处理表8.2中第 k k k列,即以 D ‾ k \overline{D}_k Dk训练出一初级学习器组,以该组处理 D k D_k Dk的样例得到对应的新样例。
将新样例并在一起,则是由 D D D生成的 D ′ D' D′。
另外,【西瓜书图8.9】中的Stacking算法是二级的情形,可以直接扩展为多级的情形。
其他级联
将投票视为一级,则基于投票法的算法(如,AdaBoost)也是级联。
在级联算法中,若基学习器又是集成算法,形成多级集成。 如:
MutilBoosting是将AdaBoost作为Bagging的基学习器,反之,IterativeBagging是将Bagging作为AdaBoost的基学习器,二者使用的“材料”一样,但“次序”不一样,产生的效果不一样:
(1)Boosting关注降低偏差,Bagging关注降低方差。 IterativeBagging提升性能特点:初级基学习器(不同的算法侧重降低偏差或方差不同) ⟶ \longrightarrow ⟶Bagging基学习器(侧重降低方差) ⟶ \longrightarrow ⟶AdaBoost(侧重降低偏差)。 而MutilBoosting算法则相反:初级基学习器(不同的算法侧重降低偏差或方差不同) ⟶ \longrightarrow ⟶AdaBoost(侧重降低偏差) ⟶ \longrightarrow ⟶Bagging基学习器(侧重降低方差)。 故应从提升性能需求(参考2.9 在机器学习开发实践中如何改善学习器的性能? ,开发过程中要经常分析下一步改进的方向)和初级基学习器的特点进行选择。
(2)Boosting中对学习器训练是采用全部样本(【西瓜书图8.3】,构造分布序列逼近全量的分布,序列中的分布用于训练基学习器),而Bagging中对学习器的训练是采用部分样本(【西瓜书图8.5】,自助采样获得子样本集用于训练基学习器),IterativeBagging中,先是每个Bagging训练它的基学习器时,采用的是对数据集 D D D取部分样本集(自助采样) D ′ D' D′,由【西瓜书式(2.1)】知,这样做有 1 3 \frac{1}{3} 31强的“漏网之鱼”,再由AdaBoost在数据集 D D D上用全量样本进行训练。 而MutilBoosting中,先是每个AdaBoost在数据集 D D D上使用全部样本进行训练,再由Bagging取部分样本 D ′ D' D′进行训练。 显然,由于“漏网之鱼”的效应,IterativeBagging更有利于减小过拟合。
本文为原创,您可以:
- 点赞(支持博主)
- 收藏(待以后看)
- 转发(他考研或学习,正需要)
- 评论(或讨论)
- 引用(支持原创)
- 不侵权
上一篇:8.5再谈投票法(硬投票,软投票)
下一篇:8.7 多样性(“好而不同”)