AdaBoost
AdaBoost是典型的Boosting算法,即找到相对容易的弱学习算法,然后通过反复学习得到一系列弱分类器,组合这些弱分类器得到一个强分类器。Boosting算法要涉及到两个部分,加法模型和前向分步算法。
- 加法模型就是说强分类器由一系列弱分类器线性相加而成。
- 前向分步就是说在训练过程中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的。
由于采用的损失函数不同,Boosting算法也因此有了不同的类型,AdaBoost就是损失函数为指数损失的Boosting算法
流程
输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),(x_N,y_N)\} T={(x1,y1),(x2,y2),(xN,yN)},其中, x i ∈ X ⊆ R n x_i∈X⊆R^n xi∈X⊆Rn, y i ∈ Y = − 1 , 1 y_i∈Y={-1,1} yi∈Y=−1,1,迭代次数M
a. 初始化训练样本的权值分布:
D
1
=
(
w
1
,
1
,
w
1
,
2
,
…
,
w
1
,
i
)
,
w
1
,
i
=
1
N
,
i
=
1
,
2
,
…
,
N
D_1=(w_{1,1},w_{1,2},…,w_{1,i}),w_{1,i}=\frac{1}{N},i=1,2,…,N
D1=(w1,1,w1,2,…,w1,i),w1,i=N1,i=1,2,…,N
b. 对于
m
=
1
,
2
,
…
,
M
m=1,2,…,M
m=1,2,…,M
- 使用具有权值分布 D m D_m Dm的训练数据集进行学习,得到弱分类器 G m ( x ) G_m(x) Gm(x)
- 计算 G m ( x ) G_m(x) Gm(x)在训练数据集上的分类误差率 e m = ∑ i = 1 N w m , i I ( G m ( x i ) ≠ y i ) e_m=\sum_{i=1}^Nw_{m,i} I(G_m (x_i )≠y_i ) em=i=1∑Nwm,iI(Gm(xi)=yi)
- 计算 G m ( x ) G_m(x) Gm(x)在强分类器中所占权重 α m = 1 2 l o g 1 − e m e m α_m=\frac{1}{2}log \frac{1-e_m}{e_m} αm=21logem1−em
- 更新训练数据集的权值分布,
z
m
z_m
zm是归一化因子,可将样本概率分布和为1
w
m
+
1
,
i
=
w
m
,
i
z
m
e
x
p
(
−
α
m
y
i
G
m
(
x
i
)
)
,
i
=
1
,
2
,
…
,
10
w_{m+1,i}=\frac{w_{m,i}}{z_m}exp(-α_m y_i G_m (x_i )),i=1,2,…,10
wm+1,i=zmwm,iexp(−αmyiGm(xi)),i=1,2,…,10
z m = ∑ i = 1 N w m , i e x p ( − α m y i G m ( x i ) ) z_m=\sum_{i=1}^Nw_{m,i}exp(-α_m y_i G_m (x_i )) zm=i=1∑Nwm,iexp(−αmyiGm(xi))
c. 最终分类器
F
(
x
)
=
s
i
g
n
(
∑
i
=
1
N
α
m
G
m
(
x
)
)
F(x)=sign(\sum_{i=1}^Nα_m G_m (x))
F(x)=sign(i=1∑NαmGm(x))
证明与推导
adaboost的损失函数为指数函数:
L
(
y
,
f
(
x
)
)
=
e
x
p
[
−
y
f
(
x
)
]
L(y,f(x))=exp[-yf(x)]
L(y,f(x))=exp[−yf(x)]
对于分类模型而言,上述损失函数,在分类正确的时候,指数部分为负数;在分类错误的时候,指数部分为正数,符合损失函数的意义。
前向分步为:
f
m
(
x
)
=
f
m
−
1
(
x
)
+
α
m
G
m
(
x
)
f_m(x)=f_{m-1}(x)+\alpha_mG_m(x)
fm(x)=fm−1(x)+αmGm(x)
将前向分步代入损失函数,可得:
L
o
s
s
=
∑
i
=
1
N
e
x
p
(
−
y
i
f
m
(
x
i
)
)
=
∑
i
=
1
N
e
x
p
(
−
y
i
(
f
m
−
1
(
x
i
)
+
α
m
G
m
(
x
i
)
)
)
Loss=\sum_{i=1}^Nexp(-y_i f_m (x_i ))=\sum_{i=1}^Nexp(-y_i (f_{m-1} (x_i )+α_m G_m (x_i )))
Loss=i=1∑Nexp(−yifm(xi))=i=1∑Nexp(−yi(fm−1(xi)+αmGm(xi)))此时
f
m
−
1
(
x
)
f_{m-1}(x)
fm−1(x)已知,即:
L
o
s
s
=
∑
i
=
1
N
w
m
,
i
~
e
x
p
(
−
y
i
α
m
G
m
(
x
i
)
)
Loss=\sum_{i=1}^N\widetilde{w_{m,i}} exp(-y_i α_m G_m (x_i ))
Loss=i=1∑Nwm,i
exp(−yiαmGm(xi))
w
m
,
i
~
=
e
x
p
(
−
y
i
(
F
m
−
1
(
x
)
)
)
\widetilde{w_{m,i}}=exp(-y_i (F_{m-1} (x)))
wm,i
=exp(−yi(Fm−1(x)))
于是分类器
G
m
(
x
)
G_m(x)
Gm(x)和这个分类器的权重
α
m
\alpha_m
αm 可以表示成:
先求
G
m
(
x
)
G_m(x)
Gm(x),分类器的权重可以认为是一个确定的数,
G
m
(
x
)
G_m(x)
Gm(x)是使得分错的(带权重的)样本里损失函数最小的那个,可以写成:
得到
G
m
∗
(
x
)
G^*_m(x)
Gm∗(x)以后,求
α
m
∗
\alpha^*_m
αm∗
把上式对 α 求导,再令导函数为 0 ,得
更新权重
相关考点
- Adaboost 由于采用boosting算法,而Boosting 算法会倾向于一直分错的样本,如果样本中有离群的错误样本,boosting就会出现效果不好的情况。即Adaboost对离群值、异常值敏感。
- Adaboost和GBDT的异同点
(1) 关注点:分错权值,残差:Adaboost每轮学习的一个基本学习器是通过改变样本的权值,关注上轮分类错误的样本的权值,以逐步减少在训练集上的分类误差率。而GBDT每轮学习一个基本学习器是通过改变输出值,每轮拟合的值为真实值与已有的加法模型的差值(即残差)。
(2) 异常点: adaboost存在异常点敏感的问题, gbdt一定程度上优化了adaboost异常点敏感的问题,但是存在难以并行的缺点
(3)树: GBDT无论是进行分类还是回归问题,都用的CART回归树,adaboost对分类问题用二叉分类树,回归问题用二叉回归树。
(4)方差偏差: 两者的目标都是优化偏差bias,必然导致训练出来的数据方差var的不稳定
实战
https://blog.csdn.net/FontThrone/article/details/78834807
https://louisscorpio.github.io/2017/11/28/%E4%BB%A3%E7%A0%81%E5%AE%9E%E6%88%98%E4%B9%8BAdaBoost/