集成学习(三):adaboost算法推导

adaboost概念(Adaptive Boosting)

AdaBoost的中文叫做自适应增强,由Yoav Freund和Robert Schapire在1995年提出。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。adaboost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分布算法时的二类分类学习方法。具体算法如下(摘自统计学习方法):

  1. 初始化训练数据的权值分布
    D 1 = ( w 11 , . . . , w 1 i , . . . , w 1 N ) , w 1 i = 1 N , i = 1 , 2 , . . . , N D_1 = (w_{11},...,w_{1i},...,w_{1N}),\quad w_{1i}=\frac{1}{N}, \quad i=1,2,...,N D1=(w11,...,w1i,...,w1N),w1i=N1,i=1,2,...,N

  2. 对m=1,2,…,M
    (a):使用具有权值分布 D M D_{M} DM的数据集进行学习,得到基本分类器 G m ( x ) : X → { − 1 , + 1 } G_m(x):\mathcal{X} \to \{-1,+1\} Gm(x):X{1,+1}
    (b):计算 G m ( x ) G_m(x) Gm(x)在训练数据集上的分类误差率:
    e m = P ( G m ( x i ) ≠ y i ) = ∑ i = 1 N w m i I ( G m ( x i ) ≠ y i ) = ∑ G m ( x i ) ≠ y i w w i e_m = P(G_m(x_i)\ne y_i)=\sum_{i=1}^Nw_{mi}I(G_m(x_i)\ne y_i) = \sum_{G_m(x_i)\ne y_i}w_{wi} em=P(Gm(xi)̸=yi)=i=1NwmiI(Gm(xi)̸=yi)=Gm(xi)̸=yiwwi

    (c ):计算 G m ( x ) G_m(x) Gm(x)的系数
    α m = 1 2 l n 1 − e m e m \alpha_m = \frac{1}{2}ln\frac{1-e_m}{e_m} αm=21lnem1em

    (d):更新数据集的权值分布
    D m + 1 = ( w m + 1 , 1 , . . . , w m + 1 , i , . . . , w m + 1 , N ) D_{m+1}=(w_{m+1,1},...,w_{m+1,i},...,w_{m+1,N}) Dm+1=(wm+1,1,...,wm+1,i,...,wm+1,N)

w m + 1 , i = w m i Z m e x p ( − α m y i G m ( x i ) ) , i = 1 , 2 , . . . , N w_{m+1,i} = \frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x_i)),\quad i=1,2,...,N wm+1,i=Zmwmiexp(αmyiGm(xi)),i=1,2,...,N

  其中 Z M Z_{M} ZM是规范化因子,它使 D m + 1 D_{m+1} Dm+1成为一个概率分布。
Z m = ∑ i = 1 N w m i e x p ( − α m y i G m ( x i ) ) Z_m = \sum_{i=1}^Nw_{mi}exp(-\alpha_my_iG_m(x_i)) Zm=i=1Nwmiexp(αmyiGm(xi))

  1. 构建基本分类器的线性组合
    f ( x ) = ∑ m = 1 M α m G m ( x ) f(x) = \sum_{m=1}^M\alpha_mG_m(x) f(x)=m=1MαmGm(x)

  得到最终分类器为:
G ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ m = 1 M α m G m ( x ) ) G(x) = sign(f(x))=sign(\sum_{m=1}^M\alpha_mG_m(x)) G(x)=sign(f(x))=sign(m=1MαmGm(x))

另外AdaBoost算法最终分类器的训练误差界为:
1 N ∑ i = 1 N I ( G ( x i ) ≠ y i ) ⩽ 1 N ∑ i e x p ( − y i f ( x i ) ) = ∏ m Z m \frac{1}{N}\sum_{i=1}^N I(G(x_i)\ne y_i) \leqslant \frac{1}{N}\sum_{i} exp(-y_if(x_i)) = \prod_{m}Z_m N1i=1NI(G(xi)̸=yi)N1iexp(yif(xi))=mZm

而二类分类问题adaboost的训练误差界为:
∏ m = 1 M Z m = ∏ m = 1 M [ 2 e m ( 1 − e m ) ] = ∏ m = 1 M ( 1 − 4 γ m 2 ) ⩽ e x p ( − 2 ∑ m = 1 M γ m 2 ) , r m = 1 2 − e m \prod_{m=1}^MZ_m = \prod_{m=1}^M [2\sqrt{e_m(1-e_m)}] = \prod_{m=1}^M\sqrt{(1-4\gamma_m^2)}\leqslant exp(-2\sum_{m=1}^M\gamma_m^2),r_{m}=\frac{1}{2}-e_{m} m=1MZm=m=1M[2em(1em) ]=m=1M(14γm2) exp(2m=1Mγm2)rm=21em

adaboost算法分析与推导

针对第一步,首先初始化训练样本的权值,总共有n个样本,那么就可以得到n个权值,记做 w n w_{n} wn,因为是第一次,所以加上标记1,为 w 1 n w_{1n} w1n,另外我们并不知道权值分布情况,可以认为每个权值都是相同的,即权值 w 1 n = 1 N w_{1n}=\frac{1}{N} w1n=N1


针对第二步,进行M轮学习,得到基本分类器 G m ( x ) G_m(x) Gm(x)以及分类器预测错误的时候此时分类误差的概率 e m e_m em ,而后面的那个符号“I”,我们可以认为是python里的boolean值的标记,相等为True,记做1;不相等为False,记做0,那么这里就表示为分类错误的情况下的权值之和。
然后计算出 α m \alpha_m αm,它表示表示 G m ( x ) G_{m}(x) Gm(x)在最终分类器中的重要性,并且作为一个二分类算法,分类正确的概率永远比错误要高,否则就没有算下去的必要了。所以 e m ≤ 1 2 e_{m}\leq\frac{1}{2} em21 1 − e m e m > 1 \frac{1-e_m}{e_m}>1 em1em>1,则 α m ≥ 0 \alpha_{m}\geq0 αm0 α m \alpha_{m} αm随着 e m {e_m} em的减小而增大,即误差率越小的基本分类器在最终分类器中的作用越大。
那么有了系数,我们便可以对数据集进行规范化或者说归一化,而这里的权值分布公式我们可以调整为:
w m + 1 , i = { w m i Z m e − α m , G m ( x i ) = y i w m i Z m e α m , G m ( x i ) ≠ y i w_{m+1,i}=\left\{ \begin{array}{c}\frac{w_{mi}}{Z_{m}}e^{-\alpha_{m}},G_{m}(x_{i})=y_{i}\\\frac{w_{mi}}{Z_{m}}e^{\alpha_{m}},G_{m}(x_{i})\neq y_{i}\end{array}\right. wm+1,i={Zmwmieαm,Gm(xi)=yiZmwmieαm,Gm(xi)̸=yi

其中 Z m Z_{m} Zm就是我们的归一化因子,那么由此可知,当出现分类错误的时候,结果是大于1的,而被正确分类样本的权值却得以缩小,因此误分类样本在下一轮学习中起更大作用,这个在下面我们会给出证明。

首先我们证明关于 Z m Z_{m} Zm,它的计算是通过错误样本数和正确样本数的加权和,推导过程如下(由于csdn好像不支持连等符号,所以只能通过latex或者axmath先运行出公式截图进来):

推出了 Z m Z_{m} Zm,下一步就是系数 a m a_{m} am,这里有一种简单的做法通过调整过后的权值公式,将分类错误的条件看成 e m e_{m} em,分类正确看成 1 − e m 1-e_{m} 1em,直接两者做除,即可得到:
e 2 a = 1 2 e m 1 − e m ⇒ a m = 1 2 l n 1 − e m e m e^{2a}=\frac{1}{2}\frac{e_{m}}{1-e_{m}}\Rightarrow a_{m}=\frac{1}{2}ln\frac{1-e_{m}}{e_{m}} e2a=211ememam=21lnem1em

做出的图,横轴为分类器错误率,纵轴为分类器系数;

虽然上面的做法求是求出来了,但忽略了很多细节,这里我推荐一篇博文的做法,链接在后面,它相当于将已知条件全部带入然后展开了,如下:
在这里插入图片描述

针对第三步,我们通过线性组合得到了它的最终分类器,加上sign表示有正例与负例。


另外还有adaboost的误差上界,这个东西我没有去推导的,它最终得到的结果也是证明了adaboost存在边界,我们可以在每一轮选取适当的 G m G_{m} Gm使得 Z m Z_{m} Zm最小,从而使得训练误差下降最快,迭代次数最少。而下界不需要考虑,正如算法的名字,叫Adaptive Boosting,表示它可以适应弱分类器各自的训练误差率。


还有关于习题,这里我推荐上面那张图的作者的博客,习题描述得很好,大道至简,如果李航140-142面的题目没有看懂,可以看下面这篇:

Adaboost算法原理分析和实例+代码(简明易懂)


前向分步算法与adaboost

在概念中提到了一句话,也是李航书中的一句话:即可以认为adaboost算法是模型为加法模型,损失函数为指数函数,学习算法为前向分步算法时的二类分类学习方法。

加法模型我们知道是什么了,可以看我上一节对于提升算法的推导,有些地方殊途同归,而对于前向分步算法我们这里直接给出重要的两步:

  1. 极小化损失函数
    ( β m , γ m ) = arg ⁡ min ⁡ β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) (\beta_m,\gamma_m) = \arg\min_{\beta,\gamma} \sum_{i=1}^N L(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma)) (βm,γm)=argβ,γmini=1NL(yi,fm1(xi)+βb(xi;γ))
  2. 更新
    f m ( x ) = f m − 1 ( x ) + β m ⎵ 系数 ⋅ b ( x ; γ m ) ⎵ 基函数和参数 f_m(x) = f_{m-1}(x) +\underbrace{\beta_m}_{\text{系数}}\cdot\underbrace{{b(x;\gamma_m)}}_{\text{基函数和参数}} fm(x)=fm1(x)+系数 βm基函数和参数 b(x;γm)

adaboost推导:
AdaBoost算法是前向分步加法算法的特例,模型是由基本分类器组成的加法模型,这里我们将 β b ( x i ; γ ) \beta b(x_i;\gamma) βb(xi;γ) = G m ( x ) G_{m}(x) Gm(x),
f ( x ) = ∑ m = 1 M α m G m ( x ) f(x) = \sum_{m=1}^M\alpha_mG_m(x) f(x)=m=1MαmGm(x)

损失函数是指数函数:
L ( y , f ( x ) ) = e x p ( − y f ( x ) ) L(y,f(x)) = exp(-y f(x)) L(y,f(x))=exp(yf(x))

因此,根据前向分步算法的步骤,我们需要求解的极小化损失函数变为了:
( α m , G m ) = arg ⁡ min ⁡ α , G ∑ i = 1 N e x p [ − y i ( f m − 1 ( x i ) + α G ( x i ) ) ] (\alpha_m,G_m) = \arg\min_{\alpha,G} \sum_{i=1}^N exp[-y_i(f_{m-1}(x_i)+\alpha G_(x_i))] (αm,Gm)=argα,Gmini=1Nexp[yi(fm1(xi)+αG(xi))]

w i ( m ) = e x p ( − y i f m − 1 ( x i ) ) w_i^{(m)} = exp(-y_i f_{m-1}(x_i)) wi(m)=exp(yifm1(xi)),因为它没有依赖关系,可以将其提出,进行第一步化简,得:
( α m , G m ) = arg ⁡ min ⁡ α , G ∑ i = 1 N w i ( m ) e x p ( − β y i G ( x i ) ) (\alpha_m,G_m) = \arg\min_{\alpha,G} \sum_{i=1}^N w_i^{(m)} exp(-\beta y_i G(x_i)) (αm,Gm)=argα,Gmini=1Nwi(m)exp(βyiG(xi))

然后我们发现 y i ∈ { − 1 , 1 } y_i \in \lbrace-1,1\rbrace yi{1,1},那么就和上面推导 Z m Z_{m} Zm一样,将其拆成两个权值相加,就是最后一步没有那么快得出来:

而很显然,如果要使上式的最后一个式子最小, e − α e^{-\alpha } eα都是常数,那么可以得到:
G m = arg ⁡ min ⁡ G ∑ i = 1 N w m i I ( y i ≠ G ( x i ) ) G_m = \arg\min_G \sum_{i=1}^N w_{mi} I(y_i \ne G(x_i)) Gm=argGmini=1NwmiI(yi̸=G(xi))

那么最终我们需要求得它最小。所以对 G m G_{m} Gm求导:
∂ L ∂ α = e α ∑ i = 1 N w m i I ( y i ≠ G ( x i ) ) + e − α ∑ i = 1 N w m i I ( y i ≠ G ( x i ) ) − e − α ∑ i = 1 N w m i \frac {\partial_L} {\partial{\alpha}} = e^{\alpha} \sum_{i=1}^N w_{mi} I(y_i \ne G(x_i)) + e^{-\alpha} \sum_{i=1}^N w_{mi} I(y_i \ne G(x_i)) - e^{-\alpha} \sum_{i=1}^N w_{mi} αL=eαi=1NwmiI(yi̸=G(xi))+eαi=1NwmiI(yi̸=G(xi))eαi=1Nwmi

然后另其为0,得到:
e α ∑ i = 1 N w m i I ( y i ≠ G ( x i ) ) = [ ∑ i = 1 N w m i − ∑ i = 1 N w m i I ( y i ≠ G ( x i ) ) ] e − α e^{\alpha} \sum_{i=1}^N w_{mi} I(y_i \ne G(x_i)) = [\sum_{i=1}^N w_{mi} - \sum_{i=1}^N w_{mi} I(y_i \ne G(x_i))] e^{-\alpha} eαi=1NwmiI(yi̸=G(xi))=[i=1Nwmii=1NwmiI(yi̸=G(xi))]eα

然后两边取对数ln,得到:
l n e α = 1 2 l n ∑ i = 1 N w m i − ∑ i = 1 N w m i I ( y i ≠ G ( x i ) ) ∑ i = 1 N w m i I ( y i ≠ G ( x i ) ) ln e^{\alpha} = \frac {1} {2} ln\frac {\sum_{i=1}^N w_{mi} - \sum_{i=1}^N w_{mi} I(y_i \ne G(x_i))} {\sum_{i=1}^N w_{mi} I(y_i \ne G(x_i))} lneα=21lni=1NwmiI(yi̸=G(xi))i=1Nwmii=1NwmiI(yi̸=G(xi))


e m = ∑ i = 1 N w m i I ( G m ( x i ) ≠ y i ) e_m =\sum_{i=1}^Nw_{mi}I(G_m(x_i)\ne y_i) em=i=1NwmiI(Gm(xi)̸=yi),则上式可以写为:
a m = 1 2 l n 1 − e m e m a_{m}=\frac{1}{2}ln\frac{1-e_{m}}{e_{m}} am=21lnem1em

与前面的推导完全一致。

adaboost算法总结

关于adaboost,其实总结也很简单,根据我上面写的概念只有三步,所以搞懂一些推导过程还是有必要的。写这篇博文的中途,就在昨天,我去看了一下周志华老师的boost 25年,很多东西深受启发,关于adaboost的过拟合问题,我没想过这其中竟然有如此多有趣的事情,当然也是周的语言风趣幽默以及他对adaboost的贡献才更加让人对于adaboost思想的升华,这里强烈推荐观看。

另外插一些题外话,本来还想再通过程序以及相应的参数说明算法,但后来想想还是算了,编程技术不到家,后期也准备学习《机器学习实战》,然后再开一个系列回来温习推导。下面的参考与推荐里面也有我找到的一个很好的代码练习博文。

参考与推荐

[1]. 《统计学习方法 李航著》第8章;
[2]. wiki. https://en.wikipedia.org/wiki/AdaBoost
[3]. 周志华的boosting 25年视频:Boost 25年
[4]. Adaboost 算法的原理与推导
[5]. Adaboost算法原理分析和实例+代码(简明易懂)
[6]. 邹博的ppt,暂时没地址
[7]. 李航《统计学习方法》第八章——用Python+Cpp实现AdaBoost算法(MNIST数据集)
[8] 从前向分步算法推导出AdaBoost

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

submarineas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值