本文为《机器学习》(周志华)、《统计学习方法》 的读书笔记
- 参考 南瓜书
个体与集成
- 集成学习通过构建并结合多个个体学习器 (individual learner) 来完成学习任务
- 同质 (homogeneous) 集成: 集成中只包含同种类型的个体学习器 (基分类器,base learner),例如 “决策树集成” 中全是决策树,"神经网络集成"中全是神经网络
- 异质 (homogeneous) 集成: 集成包含不同类型的个体学习器 (component learner),例如同时包含决策树和神经网络
- 集成学习通过将多个学习器进行结合,常可获得比单一学习器显著优越的泛化性能 ; 这对 “弱学习器" (weak learner) 尤为明显,因此集成学习的很多理论研究都是针对弱学习器进行的
- 要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定准确性,并且要有"多样性" (diversity) ,即学习器间具有差异
- 要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定准确性,并且要有"多样性" (diversity) ,即学习器间具有差异
弱学习器常指泛化性能略优于随机猜测的学习器,例如在二分类问题上精度略高于 50% 的分类器
关于集成学习性能的简单分析
- 考虑二分类问题
y
∈
{
−
1
,
+
1
}
y\in \{-1,+1\}
y∈{−1,+1} 和真实函数
f
f
f, 假定基分类器的错误率为
ϵ
\epsilon
ϵ,集成通过简单投票法结合
T
T
T 个基分类器且基分类器的错误率相互独立,则由 Hoeffding 不等式可知,集成的错误率为
- 上式显示出,随着集成中个体分类器数目 T T T 的增大,集成的错误率将指数级下降,最终趋向于零. 然而我们必须注意到,上面的分析有一个关键假设 :基学习器的误差相互独立.在现实任务中,个体学习器是为解决同一个问题训练出来的,它们显然不可能相互独立!
- 事实上,个体学习器的"准确性"和"多样性"本身就存在冲突. 一般的,准确性很高之后,要增加多样性就需牺牲准确性. 事实上,如何产生并结合"好而不同"的个体学习器,恰是集成学习研究的核心
- 根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类:
- 个体学习器间存在强依赖关系、必须串行生成的序列化方法:Boosting
- 个体学习器间不存在强依赖关系、可同时生成的并行化方法:Bagging,“随机森林” (Random Forest)
提升方法 (Boosting)
- Boosting 是一族可将弱学习器提升为强学习器的算法. 这族算法的工作机制类似:
- 前向分布算法 (forward stagewise algorithm): 先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器; 如此重复进行,直至基学习器数目达到事先指定的值
T
T
T
- 前向分布算法使得每一步只学习一个基函数及其系数,逐步逼近优化目标函数式,从而简化优化的复杂度
- 加性模型 (additive model): 最终将这 T T T 个基学习器进行加权结合
- 前向分布算法 (forward stagewise algorithm): 先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器; 如此重复进行,直至基学习器数目达到事先指定的值
T
T
T
- 从偏差-方差分解的角度看,Boosting 主要关注降低偏差,因此 Boosting 能基于泛化性能相当弱的学习器构建出很强的集成
AdaBoost (Adaptive Boosting)
- Boosting 族算法最著名的代表是 AdaBoost,下面基于 “加性模型” 来介绍 AdaBoost
默认为二分类问题: y i ∈ { − 1 , + 1 } y_i\in \{-1, + 1 \} yi∈{−1,+1}; f f f 是真实函数; ϵ t \epsilon_t ϵt 为错误率; h i h_i hi 为基分类器; H ( x ) H(\boldsymbol x) H(x) 为分类结果; sign \textrm{sign} sign 为符号函数: sign ( x ) = { 1 x > 0 − 1 x < 0 \textrm{sign}(x)=\left\{\begin{aligned}&1\ \ \ \ \ x>0\\&-1\ \ \ \ \ x<0 \end{aligned}\right. sign(x)={1 x>0−1 x<0 (这里忽略了 x = 0 x=0 x=0 的情况)
加性模型 (additive model)
- 加性模型:基学习器的线性组合 (给予错误率更低的基学习器更大的权重)
- 加性模型不采用梯度下降的思想,而是由 H ( x ) = ∑ t = 1 T − 1 α t h t ( x ) + α T h T ( x ) H(x) =\sum_{t=1}^{T−1}α_t h_t(\boldsymbol x)+α_Th_T(\boldsymbol x) H(x)=∑t=1T−1αtht(x)+αThT(x) 每次更新求解一个理论上最优的 h T h_T hT(见式 8.18)和 α T α_T αT(见式 8.11)
指数损失函数 (exponential loss function)
- 首先我们定义指数损失函数作为二分类任务的损失函数,我们的目标就是最小化指数损失函数
感性理解:
- (1) 先考虑指数损失函数 e − f ( x ) H ( x ) e^{−f(\boldsymbol x)H(\boldsymbol x)} e−f(x)H(x) 的含义: f f f 为真实函数,只能取 + 1 +1 +1 和 − 1 −1 −1,而 H ( x ) H(x) H(x) 是一个实数,可以将 ∣ H ( x ) ∣ |H(x)| ∣H(x)∣ 看作模型预测的置信度, H ( x ) H(x) H(x) 的符号看作模型预测的结果;因此 e − f ( x ) H ( x ) e^{−f(\boldsymbol x)H(\boldsymbol x)} e−f(x)H(x) 实际上衡量了模型预测的置信度和正确性,当 H ( x ) H(x) H(x) 和 f ( x ) f(x) f(x) 符号一致时,模型置信度越高损失越小,而当 H ( x ) H(x) H(x) 和 f ( x ) f(x) f(x) 符号不一致时,模型置信度越高损失越大
- (2) 符号
E
x
∼
D
[
⋅
]
\mathbb E_{x\sim\mathcal D}[·]
Ex∼D[⋅] 的含义:
D
\mathcal D
D 为概率分布,可简单理解为在数据集
D
D
D 中进行一次随机抽样,每个样本被取到的概率;因此
E
x
∼
D
[
⋅
]
\mathbb E_{x\sim\mathcal D}[·]
Ex∼D[⋅] 表示在概率分布
D
\mathcal D
D 上的期望,可简单理解为对数据集
D
D
D 以概率
D
\mathcal D
D 进行加权后的期望。即
这里的样本采样概率 D ( x ) \mathcal D(x) D(x) 即可看作赋予样本的权重
系统分析指数损失函数: 指数损失函数是 0/1 损失函数的一致的 (consistent) 替代损失函数
- 我们知道,分类问题原本的损失函数其实是 0/1 损失函数,但 0/1 损失函数不连续也不可微,因此难以被优化。所以我们想使用指数损失函数来替代 0/1 损失函数。下面证明若指数损失函数最小化,则分类错误率也将最小化
- 假设
H
(
x
)
H(x)
H(x) 能令指数损失函数最小化。由于总的损失为所有样本的损失按照样本出现概率的加权,而权重 (概率分布) 是固定的,因此这个理想的
H
(
x
)
H(x)
H(x) 能使每个样本的指数损失函数都达到最小值。这里我们对某一个样本
x
x
x 计算损失对
H
(
x
)
H(x)
H(x) 的偏导,此时有
ℓ exp ( H ∣ x ) = e − f ( x ) H ( x ) = e − H ( x ) I ( f ( x ) = 1 ) + e H ( x ) I ( f ( x ) = − 1 ) = e − H ( x ) P ( f ( x ) = 1 ∣ x ) + e H ( x ) P ( f ( x ) = − 1 ∣ x ) ∂ ℓ exp ( H ∣ x ) ∂ H ( x ) = − e − H ( x ) P ( f ( x ) = 1 ∣ x ) + e H ( x ) P ( f ( x ) = − 1 ∣ x ) \begin{aligned} \ell_{\exp }(H \mid x) &=e^{-f(x)H(x)} \\&=e^{-H(x)}\mathbb I(f(x)=1)+e^{H(x)}\mathbb I(f(x)=-1) \\&=e^{-H(x)}P(f(x)=1|x)+e^{H(x)}P(f(x)=-1|x) \\\frac{\partial\ell_{\exp }(H \mid x)}{\partial H(x)}&=-e^{-H(x)}P(f(x)=1|x)+e^{H(x)}P(f(x)=-1|x) \end{aligned} ℓexp(H∣x)∂H(x)∂ℓexp(H∣x)=e−f(x)H(x)=e−H(x)I(f(x)=1)+eH(x)I(f(x)=−1)=e−H(x)P(f(x)=1∣x)+eH(x)P(f(x)=−1∣x)=−e−H(x)P(f(x)=1∣x)+eH(x)P(f(x)=−1∣x)令偏导为零可解得
因此,有
- 这意味着 sign ( H ( x ) ) \textrm{sign} (H(x)) sign(H(x)) 达到了贝叶斯最优错误率. 换言之,若指数损失函数最小化,则分类错误率也将最小化
分类器权重更新公式
- 在 AdaBoost 算法中,第一个基分类器
h
1
h_1
h1 是通过直接将基学习算法用于初始数据分布而得; 此后迭代地生成
h
t
h_t
ht 和
α
t
α_t
αt,当基分类器
h
t
h_t
ht 基于分布
D
t
\mathcal D_t
Dt 产生后,该基分类器的权重
α
t
α_t
αt 应使得
α
t
h
t
α_th_t
αtht 最小化指数损失函数 (在 “AdaBoost 算法的训练误差分析” 一节中会说明,为什么
α
t
h
t
α_th_t
αtht 在
D
t
\mathcal D_t
Dt 上最小化指数损失函数就可以使最终的分类器误差下降最快)
ℓ exp ( α t h t ∣ D t ) = E x ∼ D t [ e − f ( x ) α t h t ( x ) ] = E x ∼ D t [ e − α t I ( f ( x ) = h t ( x ) ) + e α t I ( f ( x ) ≠ h t ( x ) ) ] = e − α t E x ∼ D t [ I ( f ( x ) = h t ( x ) ) ] + e α t E x ∼ D t [ I ( f ( x ) ≠ h t ( x ) ) ] = e − α t P x ∼ D t ( f ( x ) = h t ( x ) ) + e α t P x ∼ D t ( f ( x ) ≠ h t ( x ) ) = e − α t ( 1 − ϵ t ) + e α t ϵ t \begin{aligned} \ell_{\exp }\left(\alpha_{t} h_{t} \mid \mathcal{D}_{t}\right) &=\mathbb{E}_{\boldsymbol{x} \sim \mathcal{D}_{t}}\left[e^{-f(\boldsymbol{x}) \alpha_{t} h_{t}(\boldsymbol{x})}\right] \\ &=\mathbb{E}_{\boldsymbol{x} \sim \mathcal{D}_{t}}\left[e^{-\alpha_{t}} \mathbb{I}\left(f(\boldsymbol{x})=h_{t}(\boldsymbol{x})\right)+e^{\alpha_{t}} \mathbb{I}\left(f(\boldsymbol{x}) \neq h_{t}(\boldsymbol{x})\right)\right] \\ &=e^{-\alpha_{t}}\mathbb{E}_{\boldsymbol{x} \sim \mathcal{D}_{t}}\left[ \mathbb{I}\left(f(\boldsymbol{x})=h_{t}(\boldsymbol{x})\right)]+e^{\alpha_{t}} \mathbb{E}_{\boldsymbol{x} \sim \mathcal{D}_{t}}[\mathbb{I}\left(f(\boldsymbol{x}) \neq h_{t}(\boldsymbol{x})\right)\right] \\ &=e^{-\alpha_{t}} P_{\boldsymbol{x} \sim \mathcal{D}_{t}}\left(f(\boldsymbol{x})=h_{t}(\boldsymbol{x})\right)+e^{\alpha_{t}} P_{\boldsymbol{x} \sim \mathcal{D}_{t}}\left(f(\boldsymbol{x}) \neq h_{t}(\boldsymbol{x})\right) \\ &=e^{-\alpha_{t}}\left(1-\epsilon_{t}\right)+e^{\alpha_{t}} \epsilon_{t} \end{aligned} ℓexp(αtht∣Dt)=Ex∼Dt[e−f(x)αtht(x)]=Ex∼Dt[e−αtI(f(x)=ht(x))+eαtI(f(x)=ht(x))]=e−αtEx∼Dt[I(f(x)=ht(x))]+eαtEx∼Dt[I(f(x)=ht(x))]=e−αtPx∼Dt(f(x)=ht(x))+eαtPx∼Dt(f(x)=ht(x))=e−αt(1−ϵt)+eαtϵt其中 ϵ t = P x ∼ D t ( h t ( x ) ≠ f ( x ) ) \epsilon_t = P_{x\sim\mathcal D_t} (h_t(\boldsymbol x)\neq f(\boldsymbol x)) ϵt=Px∼Dt(ht(x)=f(x)) 为 h t ( x ) h_t(x) ht(x) 分类的错误率,每个样本的概率 D t ( x ) \mathcal D_t(x) Dt(x) 即可看作该样本的权重 - 考虑指数损失函数的导数
令上式为零可得到分类器权重更新公式:
当 ϵ t ≤ 0.5 \epsilon_t\leq0.5 ϵt≤0.5 时, α t ≥ 0 \alpha_t\geq0 αt≥0,并且由 ln \ln ln 函数的单调性可知,该分类器的权重只与分类器的错误率负相关 (即错误率越大,权重越低)
- 计算得到权重后,可以继续通过加权得到模型
H
(
x
)
H(x)
H(x):
调整训练样本分布
- AdaBoost 算法在获得
H
t
−
1
H_{t- 1}
Ht−1 之后样本分布将进行调整,使下一轮的基学习器
h
t
h_t
ht 能纠正且
H
t
−
1
H_{t-1}
Ht−1 的一些错误. 理想的
h
t
h_t
ht 能纠正
H
t
−
1
H_{t-1}
Ht−1 的全部错误,即最小化
- 因为理想的 h t h_t ht 可以纠正 H t − 1 H_{t−1} Ht−1 的全部错误,所以这里指定其权重系数为 1 1 1。如果权重系数 α t α_t αt 是个常数的话,对后续结果也没有影响
- 注意到
f
2
(
x
)
=
h
t
2
(
x
)
=
1
f^2(x) = h_t^2(x) = 1
f2(x)=ht2(x)=1,式 (8.12) 可使用泰勒展式
e
x
=
1
+
x
+
x
2
2
+
o
(
x
2
)
e^x=1+x+\frac{x^2}{2}+o(x^2)
ex=1+x+2x2+o(x2) 近似为
于是,理想的基学习器为
令 D t \mathcal D_t Dt 表示一个分布
则
由 f ( x ) , h ( x ) ∈ { − 1 , + 1 } f(x), h(x) \in\{-1 ,+1\} f(x),h(x)∈{−1,+1},有
则理想的基学习器
- 由此可见,理想的
h
t
h_t
ht 将在分布
D
t
\mathcal D_t
Dt 下最小化分类误差. 因此,弱分类器将基于分布
D
t
\mathcal D_t
Dt 来训练,且针对
D
t
\mathcal D_t
Dt 的分类误差应小于 0.5. 考虑到
D
t
\mathcal D_t
Dt 和
D
t
+
1
\mathcal D_{t+1}
Dt+1 的关系,有
(注意, Z t = E x ∼ D [ e − f ( x ) H t ( x ) ] E x ∼ D [ e − f ( x ) H t − 1 ( x ) ] Z_t=\frac{\mathbb{E}_{\boldsymbol{x} \sim \mathcal{D}}\left[e^{-f(\boldsymbol{x}) H_{t}(\boldsymbol{x})}\right]}{\mathbb{E}_{\boldsymbol{x} \sim \mathcal{D}}\left[e^{-f(\boldsymbol{x}) H_{t-1}(\boldsymbol{x})}\right]} Zt=Ex∼D[e−f(x)Ht−1(x)]Ex∼D[e−f(x)Ht(x)] 只是一个归一化常数而已)
- 由下式可知,在调整样本分布时,被
h
t
(
x
)
h_t(x)
ht(x) 误分类的样本权重变得更大,而被
h
t
(
x
)
h_t(x)
ht(x) 正确分类的样本权重则变得更小,误分类样本权值放大了
e
2
α
t
=
1
−
ϵ
t
ϵ
t
e^{2\alpha_t}=\frac{1-\epsilon_t}{\epsilon_t}
e2αt=ϵt1−ϵt 倍。因此,误分类样本在下一轮学习中起更大的作用
D t + 1 ( x ) = D t ( x ) Z t ⋅ e − f ( x ) α t h t ( x ) = D t ( x ) Z t × { e − α t if h t ( x ) = f ( x ) e α t if h t ( x ) ≠ f ( x ) \begin{aligned} \mathcal D_{t+1}(x)&=\frac{\mathcal D_{t}(x)}{Z_t}\cdot e^{-f(x)\alpha_th_t(x)} \\&=\frac{\mathcal D_{t}(x)}{Z_t}\times \begin{cases}e^{-\alpha_t}\quad\quad\text{if }h_t(x)=f(x)\\ e^{\alpha_t}\quad\quad\ \ \text{if }h_t(x)\neq f(x)\end{cases} \end{aligned} Dt+1(x)=ZtDt(x)⋅e−f(x)αtht(x)=ZtDt(x)×{e−αtif ht(x)=f(x)eαt if ht(x)=f(x)
- 由下式可知,在调整样本分布时,被
h
t
(
x
)
h_t(x)
ht(x) 误分类的样本权重变得更大,而被
h
t
(
x
)
h_t(x)
ht(x) 正确分类的样本权重则变得更小,误分类样本权值放大了
e
2
α
t
=
1
−
ϵ
t
ϵ
t
e^{2\alpha_t}=\frac{1-\epsilon_t}{\epsilon_t}
e2αt=ϵt1−ϵt 倍。因此,误分类样本在下一轮学习中起更大的作用
AdaBoost 算法
标准 AdaBoost 只适用于二分类任务
Discussion
- Boosting 算法要求基学习器能对特定的数据分布进行学习,这可通过“重赋权法"(re-weighting) 实施,即在训练过程的每一轮中,根据样本分布为每个训练样本重新赋予一个权重
- 对无法接受带权样本的基学习算法,则可通过"重采样法"(re-sampling)来处理,即在每一轮学习中,根据样本分布对训练集重新进行采样,再用重采样而得的样本集对基学习器进行训练
- 需注意的是,Boosting 算法在训练的每一轮都要检查当前生成的基学习器是否满比随机猜测好,一旦条件不满足,则当前基学习器即被抛弃,且学习过程停止
- 在此种情形下,初始设置的学习轮数 T T T 也许还远未达到,可能导致最终集成中只包含很少的基学习器而性能不佳.
- 若采用“重采样法”,则可获得“重启动”机会以避免训练过程过早停止, 即在抛弃不满足条件的当前基学习器之后,可根据当前分布重新对训练样本进行采样,再基于新的采样结果重新训练出基学习器,从而使得学习过程可以持续到预设的 T T T 轮完成
AdaBoost 算法的训练误差分析
- AdaBoost 最基本的性质是它能在学习过程中不断减少训练误差
AdaBoost 的训练误差界
- AdaBoost 算法最终分类器的训练误差界为
1 N ∑ i = 1 N I ( G ( x i ) ≠ f ( x i ) ) ⩽ 1 N ∑ i = 1 N exp ( − f ( x i ) H ( x i ) ) = ∏ t = 1 T Z t \frac{1}{N} \sum_{i=1}^{N} \mathbb I(G(x_{i}) \neq f(x_i)) \leqslant \frac{1}{N} \sum_{i=1}^N \exp (-f(x_{i})H(x_i) )=\prod_{t=1}^T Z_{t} N1i=1∑NI(G(xi)=f(xi))⩽N1i=1∑Nexp(−f(xi)H(xi))=t=1∏TZt其中 H ( x ) = ∑ t = 1 T α t h t ( x ) , G ( x ) = sign ( H ( x ) ) , Z t = ∑ i = 1 N D t ( x i ) exp ( − α t f ( x i ) h t ( x i ) ) H(x)=\sum_{t=1}^T\alpha_th_t(x),G(x)=\text{sign}(H(x)),Z_t=\sum_{i=1}^N\mathcal D_t(x_i)\exp(-\alpha_tf(x_i)h_t(x_i)) H(x)=∑t=1Tαtht(x),G(x)=sign(H(x)),Zt=∑i=1NDt(xi)exp(−αtf(xi)ht(xi)) 为调整样本分布时的归一化常数 - 上式表明,每训练一个基学习器都使得 α t h t ( x ) \alpha_th_t(x) αtht(x) 在 D t \mathcal D_t Dt 上最小化指数损失函数就是在最小化 Z t Z_t Zt,从而最小化最终分类器训练误差的上界,从而使得最终分类器的训练误差下降最快
证明
- 当 G ( x i ) ≠ f ( x i ) G(x_{i}) \neq f(x_i) G(xi)=f(xi) 时, exp ( − f ( x i ) H ( x i ) ) ≥ 1 \exp (-f(x_{i})H(x_i) )\geq1 exp(−f(xi)H(xi))≥1。由此直接推导出前半部分
- 后半部分的推导要用到
Z
t
Z_t
Zt 的定义式及调整样本分布时的递推式:
Z t = ∑ i = 1 N D t ( x i ) exp ( − α t f ( x i ) h t ( x i ) ) D t ( x i ) exp ( − α t f ( x i ) h t ( x i ) ) = Z t D t + 1 ( x i ) Z_t=\sum_{i=1}^N\mathcal D_t(x_i)\exp(-\alpha_tf(x_i)h_t(x_i))\\ \mathcal D_t(x_i)\exp(-\alpha_tf(x_i)h_t(x_i))=Z_t\mathcal D_{t+1}(x_i) Zt=i=1∑NDt(xi)exp(−αtf(xi)ht(xi))Dt(xi)exp(−αtf(xi)ht(xi))=ZtDt+1(xi)现推导如下:
1 N ∑ i = 1 N exp ( − f ( x i ) H ( x i ) ) = 1 N ∑ i = 1 N exp ( − ∑ t = 1 T α t f ( x i ) h t ( x i ) ) = ∑ i = 1 N D 1 ( x i ) ∏ t = 1 T exp ( − α t f ( x i ) h t ( x i ) ) = Z 1 ∑ i = 1 N D 2 ( x i ) ∏ t = 2 T exp ( − α t f ( x i ) h t ( x i ) ) = Z 1 Z 2 ∑ i = 1 N D 3 ( x i ) ∏ t = 3 T exp ( − α t f ( x i ) h t ( x i ) ) = . . . = Z 1 Z 2 . . . Z t − 1 ∑ i = 1 N D T ( x i ) exp ( − α T f ( x i ) h T ( x i ) ) = ∏ t = 1 T Z t \begin{aligned} \frac{1}{N} \sum_{i=1}^N \exp (-f(x_{i})H(x_i) ) &=\frac{1}{N} \sum_{i=1}^N \exp (-\sum_{t=1}^T\alpha_tf(x_{i})h_t(x_i) ) \\&=\sum_{i=1}^N\mathcal D_1(x_i) \prod_{t=1}^T\exp (-\alpha_tf(x_{i})h_t(x_i) ) \\&=Z_1\sum_{i=1}^N\mathcal D_2(x_i) \prod_{t=2}^T\exp (-\alpha_tf(x_{i})h_t(x_i) ) \\&=Z_1Z_2\sum_{i=1}^N\mathcal D_3(x_i) \prod_{t=3}^T\exp (-\alpha_tf(x_{i})h_t(x_i) ) \\&=... \\&=Z_1Z_2...Z_{t-1}\sum_{i=1}^N\mathcal D_T(x_i) \exp (-\alpha_Tf(x_{i})h_T(x_i) ) \\&=\prod_{t=1}^T Z_{t} \end{aligned} N1i=1∑Nexp(−f(xi)H(xi))=N1i=1∑Nexp(−t=1∑Tαtf(xi)ht(xi))=i=1∑ND1(xi)t=1∏Texp(−αtf(xi)ht(xi))=Z1i=1∑ND2(xi)t=2∏Texp(−αtf(xi)ht(xi))=Z1Z2i=1∑ND3(xi)t=3∏Texp(−αtf(xi)ht(xi))=...=Z1Z2...Zt−1i=1∑NDT(xi)exp(−αTf(xi)hT(xi))=t=1∏TZt
二类分类问题 AdaBoost 的训练误差界
∏ t = 1 T Z t = ∏ t = 1 T [ 2 ϵ t ( 1 − ϵ t ) ] = ∏ t = 1 T [ 1 − 4 γ t 2 ] ≤ exp ( − 2 ∑ t = 1 T γ t 2 ) \begin{aligned} \prod_{t=1}^T Z_{t} &=\prod_{t=1}^T [2\sqrt{\epsilon_t(1-\epsilon_t)}] \\&=\prod_{t=1}^T [\sqrt{1-4\gamma_t^2}] \\&\leq\exp\bigg(-2\sum_{t=1}^T\gamma_t^2\bigg) \end{aligned} t=1∏TZt=t=1∏T[2ϵt(1−ϵt)]=t=1∏T[1−4γt2]≤exp(−2t=1∑Tγt2)这里, γ t = 1 2 − ϵ t \gamma_t=\frac{1}{2}-\epsilon_t γt=21−ϵt
证明
Z
t
=
∑
i
=
1
N
D
t
(
x
i
)
exp
(
−
α
t
f
(
x
i
)
h
t
(
x
i
)
)
=
∑
i
=
1
N
D
t
(
x
i
)
I
(
f
(
x
i
)
=
h
t
(
x
i
)
)
e
−
α
t
+
D
t
(
x
i
)
I
(
f
(
x
i
)
≠
h
t
(
x
i
)
)
e
α
t
=
(
1
−
ϵ
t
)
e
−
α
t
+
ϵ
t
e
α
t
=
(
1
−
ϵ
t
)
ϵ
t
1
−
ϵ
t
+
ϵ
t
1
−
ϵ
t
ϵ
t
=
2
(
1
−
ϵ
t
)
ϵ
t
=
1
−
4
γ
t
2
\begin{aligned} Z_{t} &=\sum_{i=1}^N\mathcal D_t(x_i)\exp(-\alpha_tf(x_i)h_t(x_i)) \\&=\sum_{i=1}^N\mathcal D_t(x_i)\mathbb I(f(x_i)=h_t(x_i))e^{-\alpha_t}+\mathcal D_t(x_i)\mathbb I(f(x_i)\neq h_t(x_i))e^{\alpha_t} \\&=(1-\epsilon_t)e^{-\alpha_t}+\epsilon_te^{\alpha_t} \\&=(1-\epsilon_t)\sqrt{\frac{\epsilon_t}{1-\epsilon_t}}+\epsilon_t\sqrt{\frac{1-\epsilon_t}{\epsilon_t}} \\&=2\sqrt{(1-\epsilon_t)\epsilon_t} \\&=\sqrt{1-4\gamma_t^2} \end{aligned}
Zt=i=1∑NDt(xi)exp(−αtf(xi)ht(xi))=i=1∑NDt(xi)I(f(xi)=ht(xi))e−αt+Dt(xi)I(f(xi)=ht(xi))eαt=(1−ϵt)e−αt+ϵteαt=(1−ϵt)1−ϵtϵt+ϵtϵt1−ϵt=2(1−ϵt)ϵt=1−4γt2
- 至于不等式
∏ t = 1 T [ 1 − 4 γ t 2 ] ≤ exp ( − 2 ∑ t = 1 T γ t 2 ) \prod_{t=1}^T [\sqrt{1-4\gamma_t^2}] \leq\exp\bigg(-2\sum_{t=1}^T\gamma_t^2\bigg) t=1∏T[1−4γt2]≤exp(−2t=1∑Tγt2)则可先由 e x e^x ex 和 1 − x \sqrt{1-x} 1−x 在点 x = 0 x=0 x=0 的泰勒展开式推出不等式 1 − 4 γ t 2 ≤ exp ( − 2 γ t 2 ) \sqrt{1-4\gamma_t^2}\leq \exp(-2\gamma_t^2) 1−4γt2≤exp(−2γt2),进而得到
推论
- 如果存在
γ
>
0
\gamma> 0
γ>0,对所有
t
t
t 有
γ
t
≥
γ
\gamma_t\geq \gamma
γt≥γ, 则
1 N ∑ i = 1 N I ( G ( x i ) ≠ f ( x i ) ) ≤ exp ( − 2 ∑ t = 1 T γ t 2 ) ≤ exp ( − 2 T γ 2 ) \frac{1}{N} \sum_{i=1}^{N} \mathbb I(G(x_{i}) \neq f(x_i)) \leq\exp\bigg(-2\sum_{t=1}^T\gamma_t^2\bigg)\leq\exp\bigg(-2T\gamma^2\bigg) N1i=1∑NI(G(xi)=f(xi))≤exp(−2t=1∑Tγt2)≤exp(−2Tγ2)这表明 AdaBoost 的训练误差是以指数速率下降的 - 注意, AdaBoost 算法不需要知道下界 γ \gamma γ, 这正是 Freund 与 Schapire 设计 AdaBoost 时所考虑的。与一些早期的提升方法不同, AdaBoost 具有适应性,即它能适应弱分类器各自的训练误差率。这也是它的名称 (适应的提升) 的由来, Ada 是 Adaptive 的简写
提升树 (boosting tree)
- 提升树是以分类树或回归树为基本分类器的提升方法。提升树模型可以表示为决策树的加法模型:
其中, T ( x ; Θ m ) T(x;\Theta_m) T(x;Θm) 表示决策树, Θ m \Theta_m Θm 为决策树的参数, M M M 为树的个数
- 提升树算法采用前向分步算法。首先确定初始提升树
f
0
(
x
)
=
0
f_0(x) =0
f0(x)=0,第
m
m
m 步的模型是
通过经验风险极小化确定下一棵决策树的参数 Θ m \Theta_m Θm:
用指数损失函数的分类问题 (二分类): AdaBoost
- 对于二类分类问题,提升树算法只需将 AdaBoost 算法中的基本分类器限制为二类分类树即可
用平方误差损失函数的回归问题: 拟合残差
- 采用前向分步算法时,我们在每一步都想要找到一个最佳的回归树,它的参数
Θ
^
m
\hat\Theta_m
Θ^m 满足:
- 当采用平方误差损失函数时,
这里,
是当前模型拟合数据的残差 (residual)。所以,对回归问题的提升树算法来说,只需简单地拟合当前模型的残差即可
例
梯度提升树 (GBDT)
Gradient Boosting Decision Tree (Gradient Boosting: 拟合负梯度;Decision Tree: CART 回归树)
- 提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失函数时,每一步优化是很简单的,但对一般损失函数而言,往往每一步优化并不那么容易
- 针对这一问题,Friedman 提出了梯度提升算法。这是利用最速下降的近似方法,其关键是利用损失函数的负梯度在当前模型的值
作为回归问题提升树算法中的残差的近似值,拟合一个 CART 回归树。对于平方损失函数,它就是通常所说的残差;对于一般损失函数,它就是残差的近似值
- 由于基学习器 (CART 回归树) 拟合的是负梯度,因此对于 GBDT 而言,无论是分类问题还是回归问题,基学习器均为 CART 回归树
基于梯度提升算法的学习器叫做 GBM (Gradient Boosting Machine)。理论上,GBM 可以选择各种不同的学习算法作为基学习器。GBDT 实际上是 GBM 的一个特例
算法第 1 步初始化,估计使损失函数极小化的常数值,它是只有一个根结点的树;第 2 (a) 步计算损失函数的负梯度在当前模型的值,将它作为残差的估计;第 2 (b) 步估计回归树叶结点区域,以拟合残差的近似值;第 2 ( c c c) 步利用线性搜索估计叶结点区域的值,使损失函数极小化;第 2 (d) 步更新回归树;第 3 步得到输出的最终模型 f ^ ( x ) \hat f(x) f^(x)
Discussion
Ref: 知乎
- (1) 为什么在用 CART 回归树拟合负梯度之后,还要重新计算回归树中每个叶结点 (Region) 对应的输出值?(i.e. 2(
c
c
c) 步)
- 由于 GBDT 是加法模型,新的基函数其实就是原有模型的一个增量,因此每增加一个基模型,就相当于是模型输出值沿着损失函数关于模型输出值的负梯度方向进行了移动,且步长为 1
- 但负梯度只是指出了模型输出值应该改变的方向,因此固定步长并不一定能带来好的优化效果。为了解决这个问题,就可以进行分步操作,使用负梯度指导区域的生成,但是使用原始目标值进行优化,实际是对每个区域输出值的步长进行自适应的调整,即每棵新添加的树使用了从负梯度得到的划分 (由负梯度指导生成的划分中,相同区域的样本都具有相似的梯度方向,因此可以使用相同的步长) 和从真实损失函数值得到的区域赋值 (为每个区域赋予合适的步长),减小损失函数而非拟合负梯度才是求解本质
- (2) shrinkage: 在添加每一个新的树模型时,乘上一个小于 1 的系数
α
\alpha
α (相当于 learning rate),使得模型学习过程更加平滑
f m ( x ) = f m − 1 ( x ) + α ∑ j = 1 J c m j I ( x ∈ R m j ) f_{m}(x)=f_{m-1}(x)+\alpha\sum_{j=1}^{J} c_{m j} I\left(x \in R_{m j}\right) fm(x)=fm−1(x)+αj=1∑JcmjI(x∈Rmj)相应的需要增加基函数的个数 (从经验上来看,使用 shrinkage 之后,往往会获得更好地效果) - (3) 为什么新的基学习器不直接拟合残差?
- 这是因为我们在学习模型时,想要让模型具有一定的泛化能力,因此可能会在损失函数中加入一些正则化项,此时我们的优化目标就不再是单纯的让模型输出与标签完全一致,而是想要减小损失函数的值
- (4) GBDT 用于二分类和多分类问题:对于二分类任务 (多分类问题可以通过 OvO (One vs. One), OvR (One vs. Rest), MvM (Many vs. Many) 策略拆解为多个二分类问题),损失函数一般有指数损失函数和对数损失函数,指数损失函数为
L ( y i , f ( x i ) ) = exp { − y i f ( x i ) } L(y_i,f(x_i))=\exp\{-y_if(x_i)\} L(yi,f(xi))=exp{−yif(xi)}对数损失函数为
L ( y i , f ( x i ) ) = log ( 1 + exp { − y i f ( x i ) } ) L(y_i,f(x_i))=\log(1+\exp\{-y_if(x_i)\}) L(yi,f(xi))=log(1+exp{−yif(xi)})
XGBoost, LightGBM
Bagging 与 随机森林
- 欲得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立;虽然 “独立” 在现实任务中无法做到,但可以设法使基学习器尽可能具有较大的差异
- 给定一个训练数据集,一种可能的做法是对训练样本进行采样,产生出若干个不同的子集,再从每个数据子集中训练出一个基学习器
- 然而,为获得好的集成,我们同时还希望个体学习器不能太差.如果采样出的每个子集都完全不同,则每个基学习器只用到了一小部分训练数据,甚至不足以进行有效学习,这显然无法确保产生出比较好的基学习器
- 为解决这个问题,我们可考虑使用相互有交叠的采样子集
Bagging
Bootstrap AGGregatING
- 它直接基于 Chapter2 介绍过的自助采样法 (bootstrap sampling).
- 给定包含 m m m 个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过 m m m 次随机采样操作,我们得到含 m m m 个样本的采样集,初始训练集中有的样本在采样集里多次出现有的则从未出现. 由式 (2.1) 可知,初始训练集中约有 63.2 % 63.2\% 63.2% 的样本出现在采样集中.
- 照这样,我们可采样出 T T T 个含 m m m 个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合. 所有基学习器都使用同样的学习算法
- 在对预测输出进行结合时,Bagging 通常对分类任务使用简单投票法,对回归任务使用简单平均法 (即每个基学习器使用相同权重的投票, 平均).若分类预测时出现两个类收到同样票数的情形,则最简单的做法是随机选择一个,也可进一步考察学习器投票的置信度来确定最终胜者
D b s \mathcal D_{bs} Dbs 是自助采样产生的样本分布
- 假定基学习器的计算复杂度为 O ( m ) O(m) O(m), 则 Bagging 的复杂度大致为 T ( O ( m ) + O ( s ) ) T (O(m) + O(s)) T(O(m)+O(s)), 考虑到采样与投票/平均过程的复杂度 O ( s ) O(s) O(s) 很小,而 T T T 通常是一个不太大的常数,因此,训练一个 Bagging 集成与直接使用基学习算为处理多分类或回归任法训练一个学习器的复杂度同阶,这说明 Bagging 是一个很高效的集成学习算务
- 另外,与标准 AdaBoost 只适用于二分类任务不同,Bagging 能不经修改地用于多分类、回归等任务
- 值得一提的是,自助采样过程还给 Bagging 带来了另一个优点:由于每个 基学习器只使用了初始训练集中约 63.2% 的样本,剩下约 36.8% 的样本可用作验证集来对泛化性能进行"包外估计" (out-of-bag estimate). 为此需记录每个基学习器所使用的训练样本.
- 不妨令
D
t
D_t
Dt 表示
h
t
h_t
ht 实际使用的训练样本集,令
H
o
o
b
(
x
)
H^{oob}(x)
Hoob(x) 表示对样本
x
x
x 的包外预测,即仅考虑那些未使用
x
x
x 训练的基学习器在
x
x
x 上的预测: (即用“投票法”选择包外估计的结果)
- 则 Bagging 泛化误差的包外估计为
- 不妨令
D
t
D_t
Dt 表示
h
t
h_t
ht 实际使用的训练样本集,令
H
o
o
b
(
x
)
H^{oob}(x)
Hoob(x) 表示对样本
x
x
x 的包外预测,即仅考虑那些未使用
x
x
x 训练的基学习器在
x
x
x 上的预测: (即用“投票法”选择包外估计的结果)
- 事实上,包外样本还有许多其他用途
- 例如当基学习器是决策树时,可使用包外样本来辅助剪枝,或用于估计决策树中各结点的后验概率以辅助对零训练样本结点的处理
- 当基学习器是神经网络时,可使用包外样本来辅助早期停止以减小过拟合风险
- 从偏差-方差分解的角度看,Bagging 主要关注降低方差,在 Bagging 框架下, 我们通常选择具有低偏差、高方差的基学习器,可以利用 Bagging 能够降低方差的特点, 使得集成模型趋于低偏差、低方差, 从而降低整体的错误率。例如,它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显
随机森林 (Random Forest, RF)
- RF 在以决策树为基学习器构建 Bagging 集成的基础上,进 一步在决策树的训练过程中引入了随机属性选择,这就使得最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升 (样本扰动 + 属性扰动)
- 具体来说,传统决策树在选择划分属性时是在当前结点的属性集合(假定有 d d d 个属性)中选择一个最优属性;而在 RF 中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含 k k k 个属性的子集,然后再从这个子集中选择一个最优属性用于划分
- 这里的参数 k k k 控制了随机性的引入程度.若令 k = d k= d k=d, 则基决策树的构建与传统决策树相同,若令 k = 1 k =1 k=1, 则是随机选择一个属性用于划分, 一般情况下,推荐值 k = log 2 d k = \log_2 d k=log2d
- 值得一提的是,随机森林的训练效率常优于 Bagging, 因为在个体决策树的构建过程中,Bagging 使用的是 “确定型 ” 决策树,在选择划分属性时要对结点的所有属性进行考察,而随机森林使用的 “随机型” 决策树则只需考察一个属性子集
结合策略
- 学习器结合可能会从三个方面带来好处:
- 首先,从统计的方面来看,由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到同等性能,此时若使用单学习器可能因误选而导致泛化性能不佳,结合多个学习器则会减小这一风险
- 第二,从计算的方面来看,学习算法往往会陷入局部极小,有的局部极小点所对应的泛化性能可能很槽糕,而通过多次运行之后进行结合,可降低陷入糟糕局部极小点的风险
- 第三,从表示的方面来看,某些学习任务的真实假设可能不在当前学习算法所考虑的假设空间中,此时若使用单学习器则肯定无效,而通过结合多个学习器,由于相应的假设空间有所扩大, 有可能学得更好的近似
假定集成包含 T T T 个基学习器 { h 1 , . . . , h T } \{h_1,...,h_T\} {h1,...,hT},其中 h i h_i hi 在示例 x x x 上的输出为 h i ( x ) h_i(x) hi(x)
平均法 (averaging)
- 适用于数值型输出 h i ( x ) ∈ R h_i(x)\in\R hi(x)∈R
- 简单平均法 (simple averaging)
- 加权平均法 (weighted averaging)
通常要求 w i ≥ 0 w_i\geq0 wi≥0, ∑ i = 1 T w i = 1 \sum_{i=1}^Tw_i=1 ∑i=1Twi=1
- 对给定的基学习器,不同的集成学习方法可视为通过不同的方式来确定加权平均法中的基学习器权重
- 加权平均法的权重一般是从训练数据中学习而得 (例如估计出个体学习器的误差,然后令权重大小与误差大小成反比.),现实任务中的训练样本通常不充分或存在噪声,这将使得学出的权重不完全可靠.尤其是对规模比较大的集成来说,要学习的权重比较多,较容易导致过拟合. 因此,实验和应用均显示出,加权平均法未必一定优于简单平均法.
- 一般而言,在个体学习器性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法
投票法 (voting)
- 适用于分类任务
- 为便于讨论,我们将 h i h_i hi 在样本 x x x 上的预测输出表示为一个 N N N 维向量 ( h i 1 ( x ) ; . . . ; h i N ( x ) ) (h_i^1(x);...;h_i^N(x)) (hi1(x);...;hiN(x)), 其中 h i j ( x ) h_i^j(x) hij(x) 是 h i h_i hi 在类别标记 c j c_j cj 上的输出
- 绝对多数投票法 (majority voting)
即若某标记得票过半数,则预测为该标记;否则拒绝预测
若学习任务要求必须提供预测结果,则绝对多数投票法将退化为相对多数投票法.因此,在不允许拒绝预测的任务中,绝对多数、相对多数投票法统称为“多数投票法".
- 相对多数投票法 (plurality voting)
即预测为得票最多的标记,若同时有多个标记获最高票,则从中随机选取一个
- 加权投票法 (weighted voting)
通常要求 w i ≥ 0 w_i\geq0 wi≥0, ∑ i = 1 T w i = 1 \sum_{i=1}^Tw_i=1 ∑i=1Twi=1
- Note: 不同类型个体学习器可能产生不同类型的
h
i
j
(
x
)
h_i^j(x)
hij(x) 值,常见的有:
- 硬投票 (hard voting): h i j ( x ) ∈ { 0 , 1 } h_i^j(x)\in\{0,1\} hij(x)∈{0,1}
- 软投票 (soft voting): h i j ( x ) ∈ [ 0 , 1 ] h_i^j(x)\in[0,1] hij(x)∈[0,1], 相当于对后验概率 P ( c j ∣ x ) P(c_j|x) P(cj∣x) 的一个估计
- 不同类型的 h i j ( x ) h_i^j(x) hij(x) 值不能混用. 同时,若基学习器的类型不同则其类概率值不能直接进行比较;在此种情形下,通常可将类概率输出转化为类标记输出,然后再投票
- 有趣的是,虽然分类器估计出的类概率值一般都不太准确,但基于类概率进行结合却往往比直接基于类标记进行结合性能更好
学习法: Stacking
- 当训练数据很多时,一种更为强大的结合策略是使用 “学习法” ,即通过另一个学习器来进行结合. 这里我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器(meta-learner).
- Stacking 是学习法的典型代表
Stacking 算法
- Stacking 先从初始数据集训练出初级学习器 (相比 Bagging,Stacking 允许基学习器使用不同的学习算法),然后"生成"一个新数据集用于训练次级学习器. 在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记
生成次级学习器的训练数据
- 在训练阶段次级训练集是利用初级学习器产生的,若直接用初级学习器的训练集来产生次级训练集,则过拟合风险会比较大;因此,一般是通过使用交叉验证或留一法这样的方式,用训练初级学习器未使用的样本来产生次级学习器的训练样本
- 以 k k k 折交叉验证为例,首先划分出初始训练集 D D D ( m m m 个训练数据) 与初始测试集 T T T ( n n n 个测试数据)
- 初始训练集 D D D 被随机划分为 k k k 个大小相似的集合 D 1 , . . . , D k D_1, ... , D_k D1,...,Dk. 令 D j D_j Dj 和 D ‾ j = D \ D j \overline D_j= D\backslash D_j Dj=D\Dj 分别表示第 j j j 折的测试集和训练集. 给定 T T T 个初级学习算法,初级学习器 h t ( j ) h_t^{(j)} ht(j) 通过在 D ‾ j \overline D_j Dj 上使用第 t t t 个学习算法而得.对 D j D_j Dj 中每个样本 x i x_i xi,令 z i t = h t ( i ) ( x i ) z_{it}=h_t^{(i)}(x_i) zit=ht(i)(xi),则由 x i x_i xi 所产生的次级训练样例的示例部分为 z i = ( z i 1 ; . . . ; z i T ) z_i=(z_{i1};...;z_{iT}) zi=(zi1;...;ziT),标记部分为 y i y_i yi. 也就是说,由第 j j j 折的测试集生成了次级学习器的一部分训练样本 (共 m / k m/k m/k 个,也就是下图中一个橙色的小块);同时用训练好的 T T T 个初级学习器对初始测试集进行预测,生成一个次级测试集 (共 n n n 个,也就是下图中一个绿色的块)
- 于是,在整个交叉验证过程结束后,从这
T
T
T 个初级学习器产生的次级训练集是
D
′
=
{
(
z
i
,
y
i
)
}
i
=
1
m
D'= \{ (z_i, y_i)\}_{i=1}^m
D′={(zi,yi)}i=1m, 然后
D
′
D'
D′ 将用于训练次级学习器;同时可以得到
k
k
k 个次级测试集,对它们取平均之后就得到了最后的次级测试集
多样性
- to be continued…