adaboost概念(Adaptive Boosting)
AdaBoost的中文叫做自适应增强,由Yoav Freund和Robert Schapire在1995年提出。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。adaboost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分布算法时的二类分类学习方法。具体算法如下(摘自统计学习方法):
-
初始化训练数据的权值分布
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 -
对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=1∑NwmiI(Gm(xi)̸=yi)=Gm(xi)̸=yi∑wwi(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=21lnem1−em(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=1∑Nwmiexp(−αmyiGm(xi))
- 构建基本分类器的线性组合
f ( x ) = ∑ m = 1 M α m G m ( x ) f(x) = \sum_{m=1}^M\alpha_mG_m(x) f(x)=m=1∑Mα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=1∑Mα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=1∑NI(G(xi)̸=yi)⩽N1i∑exp(−yif(xi))=m∏Zm
而二类分类问题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=1∏MZm=m=1∏M[2em(1−em)]=m=1∏M(1−4γm2)⩽exp(−2m=1∑Mγm2),rm=21−em
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}
em≤21,
1
−
e
m
e
m
>
1
\frac{1-e_m}{e_m}>1
em1−em>1,则
α
m
≥
0
\alpha_{m}\geq0
αm≥0,
α
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}
1−em,直接两者做除,即可得到:
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=211−emem⇒am=21lnem1−em
做出的图,横轴为分类器错误率,纵轴为分类器系数;
虽然上面的做法求是求出来了,但忽略了很多细节,这里我推荐一篇博文的做法,链接在后面,它相当于将已知条件全部带入然后展开了,如下:
针对第三步,我们通过线性组合得到了它的最终分类器,加上sign表示有正例与负例。
另外还有adaboost的误差上界,这个东西我没有去推导的,它最终得到的结果也是证明了adaboost存在边界,我们可以在每一轮选取适当的 G m G_{m} Gm使得 Z m Z_{m} Zm最小,从而使得训练误差下降最快,迭代次数最少。而下界不需要考虑,正如算法的名字,叫Adaptive Boosting,表示它可以适应弱分类器各自的训练误差率。
还有关于习题,这里我推荐上面那张图的作者的博客,习题描述得很好,大道至简,如果李航140-142面的题目没有看懂,可以看下面这篇:
前向分步算法与adaboost
在概念中提到了一句话,也是李航书中的一句话:即可以认为adaboost算法是模型为加法模型,损失函数为指数函数,学习算法为前向分步算法时的二类分类学习方法。
加法模型我们知道是什么了,可以看我上一节对于提升算法的推导,有些地方殊途同归,而对于前向分步算法我们这里直接给出重要的两步:
- 极小化损失函数
( β 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=1∑NL(yi,fm−1(xi)+βb(xi;γ)) - 更新
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)=fm−1(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=1∑Mα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=1∑Nexp[−yi(fm−1(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(−yifm−1(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=1∑Nwi(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=1∑NwmiI(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=1∑NwmiI(yi̸=G(xi))+e−αi=1∑NwmiI(yi̸=G(xi))−e−αi=1∑Nwmi
然后另其为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=1∑NwmiI(yi̸=G(xi))=[i=1∑Nwmi−i=1∑NwmiI(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α=21ln∑i=1NwmiI(yi̸=G(xi))∑i=1Nwmi−∑i=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=21lnem1−em
与前面的推导完全一致。
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