深入理解机器学习——集成学习(二):提升法Boosting与Adaboost算法

Boosting是一族可将弱学习器提升为强学习器的算法。这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值 T T T,最终将这 T T T个基学习器进行加权结合。

Boosting族算法最著名的代表是AdaBoost:

Adaboost算法
输入:
\qquad 训练集: D = ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) D = {(x_1, y_1), (x_2, y_2), \cdots, (x_N, y_N)} D=(x1,y1),(x2,y2),,(xN,yN)
\qquad 基学习算法: L L L
\qquad 训练轮数: T T T
输出:
H ( x ) = sign ( ∑ i = 1 T α i h i ( x ) ) \qquad H(x)=\text{sign}(\sum_{i=1}^T\alpha_ih_i(x)) H(x)=sign(i=1Tαihi(x))
算法:.
( 1 ) D 1 ( x ) = 1 m D_1(x)=\frac{1}{m} D1(x)=m1
( 2 ) for i = 1 , 2 , ⋯   , T i = 1, 2, \cdots, T i=1,2,,T do
( 3 ) h i = L ( D , D i ) \quad h_i=L(D, D_i) hi=L(D,Di)
( 4 ) ϵ i = P x ∼ D i ( h i ( x ) ≠ f ( x ) ) \quad \epsilon_i=P_{x\sim D_i}(h_i(x)\neq f(x)) ϵi=PxDi(hi(x)=f(x))
( 5 ) \quad if ϵ i > 0.5 \epsilon_i>0.5 ϵi>0.5 then
( 6 ) \qquad break
( 7 ) α i = 1 2 ln ⁡ 1 − ϵ i ϵ i \quad \alpha_i=\frac{1}{2}\ln\frac{1-\epsilon_i}{\epsilon_i} αi=21lnϵi1ϵi
( 8 ) D i + 1 ( x ) = D i ( x ) exp ⁡ ( − α i f ( x ) h i ( x ) ) Z i \quad D_{i+1}(x)=\frac{D_i(x)\exp{(-\alpha_if(x)h_i(x))}}{Z_i} Di+1(x)=ZiDi(x)exp(αif(x)hi(x))
( 9 ) end for

其中, y i ∈ { + 1 , − 1 } y_i\in\{+1,-1\} yi{ +1,1} f f f是真实函数, D i D_i Di是第 i i i轮训练数据的权重。

Adaboost算法有多种推导方式,比较容易理解的是基于“加性模型”,即基学习器的线性组合:
H ( x ) = sign ( ∑ i = 1 T α i h i ( x ) ) H(x)=\text{sign}(\sum_{i=1}^T\alpha_ih_i(x)) H(x)=sign(i=1Tαihi(x))

来最小化指数损失函数:
l ( H ∣ D ) = E x ∼ D [ e − f ( x ) H ( x ) ] l(H|D)=E_{x\sim D}[e^{-f(x)H(x)}] l(HD)=ExD[ef(x)H(x)]

指数损失函数最小化,则分类错误率也将最小化。这说明指数损失函数是分类任务原本0/1损失函数的一致的替代损失函数。由于这个替代函数有更好的数学性质,例如它是连续可微函数,因此我们用它替代0/1损失函数作为优化目标。

在Adaboost算法中,第一个基分类器 h 1 h_1 h1是通过直接将基学习算法用于初始数据分布而得;此后迭代地生成 h i h_i hi α i \alpha_i αi,当基分类器 h i h_i hi基于分布 D i D_i Di产生后,该基分类器的权重 α i \alpha_i αi应使得 α i h i \alpha_ih_i αihi最小化指数损失函数:
l ( α i h i ∣ D ) = E x ∼ D i [ e − f ( x ) α i h i ( x ) ] = e − α i ( 1 − ϵ i ) + e α i ϵ i l(\alpha_ih_i|D)=E_{x\sim D_i}[e^{-f(x)\alpha_ih_i(x)}]=e^{-\alpha_i}(1-\epsilon_i)+e^{\alpha_i}\epsilon_i l(αihiD)=ExDi[ef(x)αihi(x)]=eαi(1ϵi)+eαiϵi

考虑指数损失函数的导数:
∂ l ( α i h i ∣ D i ) ∂ α i = − e − α i ( 1 − ϵ i ) + e α i ϵ i = 0 \frac{\partial l(\alpha_ih_i|D_i)}{\partial\alpha_i}=-e^{-\alpha_i}(1-\epsilon_i)+e^{\alpha_i}\epsilon_i=0 αil(αihiDi)=eαi(1ϵi)+eαiϵi=0

可解得:
α i = 1 2 ln ⁡ 1 − ϵ i ϵ i \alpha_i=\frac{1}{2}\ln\frac{1-\epsilon_i}{\epsilon_i} αi=21lnϵi1ϵi

AdaBoost算法在获得 H i − 1 H_{i-1} Hi1之后样本分布将进行调整,使下一轮的基学习器 h i h_i hi能纠正 H i − 1 H_{i-1} Hi1的一些错误。理想的 h i h_i hi能纠正 H i − 1 H_{i-1} Hi1的全部错误,即最小化:
l ( H i − 1 + h i ∣ D ) = E x ∼ D [ e − f ( x ) ( H i − 1 + h i ) ] l(H_{i-1}+h_i|D)=E_{x\sim D}[e^{-f(x)(H_{i-1}+h_i)}] l(Hi1+hiD)=ExD[ef(x)(Hi1+hi)]

Boosting算法要求基学习器能对特定的数据分布进行学习,这可通过“重赋权法”(实施,即在训练过程的每一轮中,根据样本分布为每个训练样本重新赋予一个权重。对无法接受带权样本的基学习算法,则可通过“重样法”来处理,即在每一轮学习中,根据样本分布对训练集重新进行样,再用重样而得的样本集对基学习器进行训练。

一般而言,这两种做法没有显著的优劣差别需注意的是, Boosting算法在训练的每一轮都要检查当前生成的基学习器是否满足基本条件,例如检查当前基分类器是否是比随机猜测好,一旦条件不满足,则当前基学习器即被抛弃,且学习过程停止。在此种情形下,初始设置的学习轮数 T T T也许还远未达到,可能导致最终集成中只包含很少的基学习器而性能不佳。若采用“重采样法”,则可获得“重启动”机会以避免训练过程过早停止,即在抛弃不满足条件的当前基学习器之后,可根据当前分布重新对训练样本进行采样,再基于新的采样结果重新训练出基学习器,从而使得学习过程可以持续到预设的 T T T轮完成。

从偏差方差分解的角度看, Boosting主要关注降低偏差,因此 Boosting能基于泛化性能相当弱的学习器构建出很强的集成。

你可能感兴趣的:(深入理解机器学习,机器学习,深度学习,集成学习,boosting,adaboost算法)