今天看了周志华教授的Boosting算法研究报告,之前我也有学习过AdaBoost算法,现在就想结合周教授的讲座和自己对boosting算法的理解写一篇博文。说到Boosting算法,其实Boosting算法是一个算法族,所有的Boosting算法都是基于属于Boosting算法族,然而AdaBoosting算法是Boosting算法族中的一个典型的代表。
Boosting是一族可将弱学习器提升为强学习器的算法,这族算法的工作机制都很相似:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器预测错误的训练样本在后续受到更多的关注,给予更高的权重,然后基于调整之后的样本来训练下一个学习器。 重复这个过程直到基学习器数目达到事先指定的值T,最终将T个学习器进行加权结合。做一个准确率50%-60%的分类器是很容易的,但是要做一个95%+的分类器是比较难的,我们可以将多个准确率为50%-60%的弱分类器进行线性组合,最终可以组合成一个95%+的强分类器,AdaBoost算法就是将多个弱的分类器组合起来成为一个强的分类器。
首先我们来看看AdaBoost算法的流程:
输入:
训练集:
D
= { (
x
1
,
y
1
),(
x
2
,
y
2
),(
x
3
,
y
3
),
.
.
.
,(
x
n
,
y
n
)}
D{\text{ = \{ (}}{{\text{x}}_1}{\text{,}}{{\text{y}}_1}{\text{),(}}{{\text{x}}_2}{\text{,}}{{\text{y}}_2}{\text{),(}}{{\text{x}}_3}{\text{,}}{{\text{y}}_3}{\text{),}}...{\text{,(}}{{\text{x}}_n}{\text{,}}{{\text{y}}_n}{\text{)\} }}
D = { (x1,y1),(x2,y2),(x3,y3),...,(xn,yn)} ;
基学习算法:
A
{\rm A}
A
训练轮数:T
过程:
1:
D
1
(
x
)
=
1
n
{D_1}(x) = \frac{1}{n}
D1(x)=n1
2:for t = 1,2,3,…,T do
3:
h
t
=
A
(
D
,
D
t
)
;
{h_t} = {\rm A}(D,{D_t});
ht=A(D,Dt);
4:
ε
t
=
P
x
−
D
t
(
h
t
(
x
)
≠
f
(
x
)
)
{\varepsilon _t} = {P_{x-{D_t}}}({h_t}(x) \neq f(x))
εt=Px−Dt(ht(x)̸=f(x))
5:if
ε
t
>
0.5
{\varepsilon _t} > 0.5
εt>0.5 then break
6:
α
t
=
1
2
ln
(
1
−
ε
t
ε
t
)
{\alpha _t} = \frac{1}{2}\ln (\frac{{1 - {\varepsilon _t}}}{{{\varepsilon _t}}})
αt=21ln(εt1−εt);
7:
D
t
+
1
(
x
)
=
D
t
(
x
)
Z
t
⋅
exp
(
−
α
t
)
,
i
f
h
(
x
)
=
f
(
x
)
{D_{t + 1}}(x) = \frac{{{D_t}(x)}}{{{Z_t}}} \cdot \exp ( - {\alpha _t}),if~h(x) = f(x)
Dt+1(x)=ZtDt(x)⋅exp(−αt),if h(x)=f(x)
D
t
+
1
(
x
)
=
D
t
(
x
)
Z
t
⋅
exp
(
α
t
)
,
i
f
h
(
x
)
≠
f
(
x
)
{D_{t + 1}}(x) = \frac{{{D_t}(x)}}{{{Z_t}}} \cdot \exp ({\alpha _t}),if~h(x) \ne f(x)
Dt+1(x)=ZtDt(x)⋅exp(αt),if h(x)̸=f(x)
⇔
D
t
+
1
(
x
)
=
D
t
(
x
)
exp
(
−
α
t
f
(
x
)
h
t
(
x
)
)
Z
t
\Leftrightarrow {D_{t + 1}}(x) = \frac{{{D_t}(x)\exp ( - {\alpha _t}f(x){h_t}(x))}}{{{Z_t}}}
⇔Dt+1(x)=ZtDt(x)exp(−αtf(x)ht(x))
8:end for
输出:
H
(
x
)
=
s
i
g
n
(
∑
t
=
1
T
α
t
h
t
(
x
)
)
H(x) = sign(\sum\limits_{t = 1}^T {{\alpha _t}{h_t}(x)} )
H(x)=sign(t=1∑Tαtht(x))
如上所述就是AdaBoost算法的整个完整的流程,在上述的算法中
D
n
{D_n}
Dn代表的是每一次调整权重之后的权值分布,
ε
t
{\varepsilon _t}
εt表示第t轮的残差,
α
t
{\alpha _t}
αt表示权重系数,h(x)表示预测函数,f(x)表示真实函数,
h
t
{h_t}
ht表示弱分类器,
Z
t
{Z_t}
Zt表示规范化因子,以确保
D
t
+
1
{D_{t + 1}}
Dt+1是一个分布。
有了如上的描述,我们可以看看AdaBoost算法的整个详细流程:最开始把每个弱分类器的权值都初始化一样,然后有一个基学习算法来计算我们的预测函数,然后我们可以计算每一个弱分类器的残差,然后根据每一轮的残差来计算下一轮的权值,最终我们可以调整新一轮的权值分布,直到循环迭代次数达到T,最终我们可以得到每一个若分类器的权值,将这些弱分类器进行线性相连,我们就可以得到一个强分类器
H
(
x
)
H(x)
H(x)。
其实Boosting算法要求基学习器能对特定的数据分布进行学习,这可通过“重赋权法”实施,就是在训练过程的每一轮中,根据样本分布为每个训练样本重新赋予一个权重,对于无法接受带权样本的基学习算法,则可以通过“重采样法”来处理,也就是说再每一轮的学习中,根据样本分布对训练集重新进行采样,再用重采样得到的样本集对基学习器进行训练。以上就是AdaBoost算法的核心思想,主要就是通过残差来调整我们及基学习器的权值分布,将我们的弱分类器进行线性组合,最终可以得到一个强的分类器了。以上就是AdaBoost算法的基本思想,希望对大家的Boosting族算法有一个基本的理解。