简明理解AdaBoost算法
从案例理解AdaBoost
(转载自李航《统计学习方法》,有删减),使用AdaBoost算法学习如下训练数据,弱分类器采用sign()函数。
x |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
y |
1 |
1 |
1 |
-1 |
-1 |
-1 |
1 |
1 |
1 |
解:
初始化数据权值分布,即
m=0
D1=(w11,w12,...,w110)
w1i=0.1,i=1,2,...,10
对
m=1:
(1) 基本分类器:
G1(x)=−sign(x−2.5)
(2) 误差率
e1=P(G1(xi)̸=yi)=0.3
(3) 计算
G1(x)的系数:
α1=21loge11−e1=0.4236
(4) 更新权值分布:
D2(w21,w22,...,w210)
w2i=Z1w1iexp(−α1yiG1(xi)),i=1,2,...,10
f1(x)=0.4236G1(x)分类器
sign[f1(x)]在训练数据集上有3个误分类点。
对
m=2,m=3分别执行以上步骤:
G(x)=sign[0.4236G1(x)+0.6496G2(x)+0.7514G3(x)]
import numpy as np
import matplotlib.pyplot as plt
x0 = [0,1,2,3,4,5,6,7,8,9]
y0 = [1,1,1,-1,-1,-1,1,1,1,-1]
x1 = np.linspace(-1,10,100)
G1 = -np.sign(x1-2.5)
G2 = -np.sign(x1-8.5)
G3 = np.sign(x1-5.5)
fig, axs = plt.subplots(2,2)
axs[0,0].scatter(x0,y0)
axs[0,0].plot(x1,G1)
axs[0, 0].set_title('f1(x)', fontsize=10)
axs[0,1].scatter(x0,y0)
axs[0,1].plot(x1,np.sign(0.4236*G1+G2))
axs[0,1].set_title('f2(x)', fontsize=10)
axs[1,0].scatter(x0,y0)
axs[1,0].plot(x1,np.sign(0.4236*G1+0.6496*G2+G3))
axs[1,0].set_title('f3(x)', fontsize=10)
axs[1,1].scatter(x0,y0)
axs[1,1].plot(x1,np.sign(0.4236*G1+0.6496*G2+0.7514*G3))
axs[1,1].set_title('f3(x)', fontsize=10)
fig.tight_layout()
plt.show()
最终通过sign分类的线性组合,逐步将训练误差减少到0
案例分析
针对二分类的提升(boosting)方法有两个步骤:
1、改变训练数据的权值或概率分布
2、将弱分类器组合为强分类器
涉及计算内容为:
- 计算$G_m(x)的系数:
αm=21logem1−em
- 更新权重:
Dm+1(wm+1,1,wm+1,2,...,wm+1,N)
wm+1,i=Zmwm,iexp(−αmymGm(xi)),i=1,2,...,N其中,
Zm是规范化因子,有
Zm=i=1∑Nexp(−αmymGm(xi))
当正确分类时:
wm+1=Zmwmie−αm,权值缩小
当错误分类时:
wm+1=Zmwmieαm,权值放大