机器学习笔记之集成学习——Stacking
引言
上一节介绍了基于 Gradient Boosting \text{Gradient Boosting} Gradient Boosting架构的经典模型——梯度提升树( Gradient Boosting Decision Tree,GBDT \text{Gradient Boosting Decision Tree,GBDT} Gradient Boosting Decision Tree,GBDT)。本节将介绍另一种集成学习思想—— Stacking \text{Stacking} Stacking。
回顾: Bagging \text{Bagging} Bagging架构
给定数据集合 D = { ( x ( i ) , y ( i ) ) } i = 1 N \mathcal D = \{(x^{(i)},y^{(i)})\}_{i=1}^N D={(x(i),y(i))}i=1N,基于 Bagging \text{Bagging} Bagging架构的算法执行过程可表示为如下形式:
- 使用自助采样法(
Boostrapping Sampling
\text{Boostrapping Sampling}
Boostrapping Sampling)对原始数据集合
D
\mathcal D
D进行操作,每次
Boostrapping
\text{Boostrapping}
Boostrapping均会产生一个新的训练集
D
k
∈
D
\mathcal D_k \in \mathcal D
Dk∈D,重复执行
K
\mathcal K
K次,最终得到
K
\mathcal K
K个训练集:
D 1 , D 2 , ⋯ , D K \mathcal D_1,\mathcal D_2,\cdots,\mathcal D_{\mathcal K} D1,D2,⋯,DK - 针对每个训练集
D
k
(
k
=
1
,
2
,
⋯
,
K
)
\mathcal D_k(k=1,2,\cdots,\mathcal K)
Dk(k=1,2,⋯,K)均安排一个模型
h
k
(
x
)
h_k(x)
hk(x)对其进行独立训练。我们称这些模型为基学习器(
Base Learner
\text{Base Learner}
Base Learner)。相应地,最终会得到
K
\mathcal K
K个基学习器:
h 1 ( x ) , h 2 ( x ) , ⋯ , h K ( x ) h_1(x),h_2(x),\cdots,h_{\mathcal K}(x) h1(x),h2(x),⋯,hK(x) - 此时,得到训练好的模型
h
k
(
x
)
(
k
=
1
,
2
,
⋯
,
K
)
h_k(x)(k=1,2,\cdots,\mathcal K)
hk(x)(k=1,2,⋯,K)后,针对不同的任务类型,对
Bagging
\text{Bagging}
Bagging输出结果进行描述:
- 回归任务( Regression Task \text{Regression Task} Regression Task): K \mathcal K K个基学习器预测结果取均值;
- 分类任务( Classification Task \text{Classification Task} Classification Task):对 K \mathcal K K个基学习器预测结果进行投票( Voting \text{Voting} Voting),选择投票多的结果作为最终归属分类。
Stacking \text{Stacking} Stacking架构描述
同样给定数据集合 D = { ( x ( i ) , y ( i ) ) } i = 1 N \mathcal D = \{(x^{(i)},y^{(i)})\}_{i=1}^N D={(x(i),y(i))}i=1N,基于 Boosting \text{Boosting} Boosting架构的算法执行过程可表示为如下形式:
- 选择
K
\mathcal K
K种不同类别模型作为基学习器,并使用数据集
D
\mathcal D
D对每一个基学习器进行独立训练。最终得到
K
\mathcal K
K个训练好的基学习器:
h 1 ( x ) , h 2 ( x ) , ⋯ , h K ( x ) h_1(x),h_2(x),\cdots,h_{\mathcal K}(x) h1(x),h2(x),⋯,hK(x) - 假设关于某样本特征
x
(
i
)
x^{(i)}
x(i),关于某具体任务的预测结果
y
p
r
e
d
(
i
)
y_{pred}^{(i)}
ypred(i)可以视作:将各基学习器的预测结果
h
1
(
x
(
i
)
)
,
h
2
(
x
(
i
)
)
,
⋯
,
h
K
(
x
(
i
)
)
h_1(x^{(i)}),h_2(x^{(i)}),\cdots,h_{\mathcal K}(x^{(i)})
h1(x(i)),h2(x(i)),⋯,hK(x(i))拼接
(
Concatenate
)
(\text{Concatenate})
(Concatenate)起来,作为新的数据集
D
′
\mathcal D'
D′:
{ D ′ = { ( z ( i ) , y ( i ) ) } i = 1 N z ( i ) = Concatenate [ h 1 ( x ( i ) ) , h 2 ( x ( i ) ) , ⋯ , h K ( x ( i ) ) ] i = 1 , 2 , ⋯ , N \begin{cases} \mathcal D' = \{(z^{(i)},y^{(i)})\}_{i=1}^N \\ z^{(i)} = \text{Concatenate}\left[h_1(x^{(i)}),h_2(x^{(i)}),\cdots,h_{\mathcal K}(x^{(i)})\right] \quad i=1,2,\cdots,N \end{cases} {D′={(z(i),y(i))}i=1Nz(i)=Concatenate[h1(x(i)),h2(x(i)),⋯,hK(x(i))]i=1,2,⋯,N
此时再次对 D ′ \mathcal D' D′重新建模,最终得到关于样本特征 x ( i ) x^{(i)} x(i)预测结果 y p r e d ( i ) y_{pred}^{(i)} ypred(i):
通常使用全连接层对
z ( i ) z^{(i)} z(i)进行学习。
y p r e d ( i ) = DenseLayer ( z ( i ) ) \begin{aligned} y_{pred}^{(i)} & = \text{DenseLayer}(z^{(i)}) \\ \end{aligned} ypred(i)=DenseLayer(z(i))
Stacking VS Bagging \text{Stacking VS Bagging} Stacking VS Bagging
通过对 Stacking \text{Stacking} Stacking架构的描述,可以发现 Stacking \text{Stacking} Stacking架构和 Bagging \text{Bagging} Bagging之间存在相似之处,它们本质上均是融合若干个基学习器的预测结果,以降低方差。
但关于
Stacking
\text{Stacking}
Stacking的核心区别在于:
再回首:
Bagging
\text{Bagging}
Bagging是在不同数据集合上训练同一类别模型;
Stacking
\text{Stacking}
Stacking是在相同数据集合上训练不同类别模型。
其核心思想是:针对不同模型对于相同数据预测结果的差异性,在各预测结果
Conbine
\text{Conbine}
Conbine过程中,起到降低方差的作用 -> 差异性因模型类别的差异而产生的。
相比之下,
Bagging
\text{Bagging}
Bagging关于各预测结果的差异性很‘刻意’。依然以随机森林为例,为了保持各基学习器的差异性,我们设置参数故意让决策树有一定概率选择不到最优解,使其强行学习‘模糊/不够准确’。
-
Stacking \text{Stacking} Stacking架构的基学习器可以存在不同的模型类别;而 Bagging \text{Bagging} Bagging架构的基学习器均是同一类型的。例如随机森林( Random Forest,RF \text{Random Forest,RF} Random Forest,RF)。它的基学习器均是决策树( Decision Tree \text{Decision Tree} Decision Tree)。
相比之下, Stacking \text{Stacking} Stacking可以使用不同的基学习器进行处理。例如随机森林、 GBDT \text{GBDT} GBDT、多层感知机( Multilayer Perceptron,MLP \text{Multilayer Perceptron,MLP} Multilayer Perceptron,MLP)等等。
-
相比于 Bagging \text{Bagging} Bagging架构对于数据集合的自助采样法,我们甚至不需要对数据集进行 Boostrap \text{Boostrap} Boostrap,直接用原始数据集 D \mathcal D D即可。因为各基学习器可能已经执行过采样操作了:
从泛化的角度观察,
Boostrap \text{Boostrap} Boostrap采样本身就是增加基学习器对于特征学习的多样性。而
Stacking \text{Stacking} Stacking已经将该多样性转移至不同类别的模型中。并且,该多样性不仅仅体现在模型结构,而且也可能体现在各模型对于特征的选择上。
-
Bagging \text{Bagging} Bagging架构针对不同任务通常使用均值、投票的方式获取结果,原因在于基学习器模型类别相同,对于数据预测的标尺( Scale \text{Scale} Scale)是相似的。
而 Stacking \text{Stacking} Stacking不同类型的基学习器对于预测结果可能存在不同的标尺,那么关于各基学习器的预测结果的 Conbine \text{Conbine} Conbine问题, Stacking \text{Stacking} Stacking将每个基学习器的预测结果拼接起来,使用全连接神经网络进行重新学习,最终得到预测结果。
这里关注的点在于,各预测结果
Concatenate \text{Concatenate} Concatenate的向量是可以通过神经网络学习的。当然也可以使用投票、均值的方法(均值就意味着各学习器权重相同),不绝对。
从预测结果的角度观察,虽然各预测结果可能存在不同标尺,但是它们的预测方向是相似的。即:某个样本特征的预测标签结果大概率不会出现完全相反的情况。因而不一定需要非常复杂的模型去学习融合特征。