Adaboost算法学习笔记

1 原理

1.1 什么是Adaboost

Adaptive Boosting, Adaboost,翻译过来就是自适应增强,由Yoav Freund和Robert Schapire在1995年提出。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。
其主要步骤为:

  • 初始化训练数据的权值分布。如果有NN个样本,则每一个训练样本最开始时都被赋予相同的权值:1N\frac{1}{N}
  • 训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
  • 将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。

1.2 算法流程

给定一个训练数据集T={(x1,y1),(x2,y2)(xN,yN)}T=\{(x_1,y_1), (x_2,y_2)…(x_N,y_N)\},其中实例xXx \in \mathcal{X},而实例空间XRn\mathcal{X} \subset \mathbb{R}^nyiy_i属于标记集合{1,+1}\{-1,+1\},Adaboost的目的就是从训练数据中学习一系列弱分类器或基本分类器,然后将这些弱分类器组合成一个强分类器。
其算法流程为:

1. 步骤一
首先,初始化训练数据的权值分布,每一个训练样本最开始时都被赋予相同的权值:1N\frac{1}{N}
D1=(ω11,ω12,...,ω1i,...,ω1N),ω1i=1N,i=1,2,...,N D_1=(\omega_{11},\omega_{12},...,\omega_{1i},...,\omega_{1N}),\omega_{1i}=\frac{1}{N},i=1,2,...,N
2.步骤二
进行多轮迭代,用m=1,2,...,Mm = 1,2, ..., M表示迭代的轮次。

  • 使用具有权值分布DmD_m的训练数据集学习,得到基本分类器(选取让误差率最低的阈值来设计基本分类器):
    Gm(x):X{1,1} G_m(x):\mathcal{X}\rightarrow \{-1,1\}
  • 计算Gm(x)G_m(x)在训练数据集上的分类误差率
    em=P(Gm(xi)yi)=i=1NωmiI(Gm(xi)yi) e_m=P(G_m(x_i)\neq y_i)=\sum_{i=1}^{N}\omega_{mi}I(G_m(x_i)\neq y_i)
    由此可知,Gm(x)G_m(x)在训练数据集上的误差率eme_m就是Gm(x)G_m(x)误分类样本的权值之和。
  • 计算Gm(x)G_m(x)的系数,αm\alpha_m表示Gm(x)G_m(x)在最终分类器中的重要程度,即该分类器在最终分类器中的权重。
    αm=12ln1emem \alpha_m=\frac{1}{2}ln\frac{1-e_m}{e_m}
    其图像为:
    Adaboost算法学习笔记
    可知,em12e_m\leq\frac{1}{2}时,αm0\alpha_m\geq 0,且αm\alpha_m随着eme_m的减小而增大,这意味着分类误差率越小的基本分类器在最终分类器中的作用越大。
  • 更新训练数据集的权值分布,用于下一轮迭代,更新方法为:
    Dm+1=(ωm+1,1,ωm+1,2,...,ωm+1,N)ωm+1,i=ωmiZmeαmyiGm(xi)i=1,2,...,N D_{m+1}=(\omega_{m+1,1},\omega_{m+1,2},...,\omega_{m+1,N}) \\ \omega_{m+1,i}=\frac{\omega_{mi}}{Z_m}e^{-\alpha_my_iG_m(x_i)} \\ 其中,i=1,2,...,N
    使得被基本分类器Gm(x)G_m(x)误分类样本的权值增大,而被正确分类样本的权值减小。就这样,通过这样的方式,AdaBoost方法能“重点关注”或“聚焦于”那些较难分的样本上。
    其中,ZmZ_m是规范化因子,使得Dm+1D_{m+1}成为一个概率分布:
    Zm=i=1NωmieαmyiGm(xi) Z_m=\sum_{i=1}^{N}\omega_{mi}e^{-\alpha_my_iG_m(x_i)}
    3.步骤三
    组合各个弱分类器:
    f(x)=m=1MαmGm(x) f(x)=\sum_{m=1}^{M}\alpha_mG_m(x)
    从而得到最终分类器,如下:
    G(x)=sign(f(x))=sign(m=1MαmGm(x)) G(x)=sign(f(x))=sign(\sum_{m=1}^{M}\alpha_mG_m(x))

2 实例

有以下样本:

序号 1 2 3 4 5 6 7 8 9 X
X 0 1 2 3 4 5 6 7 8 9
Y 1 1 1 -1 -1 -1 1 1 1 -1

求解过程:初始化训练数据的权值分布,令每个权值ω1i=1N=0.1\omega_{1i}=\frac{1}{N}=0.1,其中,N=10N=10i=1,2,...,10i = 1,2,...,10,然后分别对于m=1,2,3,...m = 1,2,3,...等值进行迭代。

数据分析

拿到这10个数据的训练样本后,根据 XXYY的对应关系,要把这10个数据分为两类,一类是“1”,一类是“-1”,根据数据的特点发现:

  • “0 1 2”这3个数据对应的类是“1”;
  • “3 4 5”这3个数据对应的类是“-1”;
  • “6 7 8”这3个数据对应的类是“1”;
  • 9是比较孤独的,对应类“-1”。

抛开孤独的9不讲,“0 1 2”、“3 4 5”、“6 7 8”这是3类不同的数据,分别对应的类是1、-1、1,直观上推测可知,可以找到对应的数据分界点,比如2.5、5.5、8.5 将那几类数据分成两类。当然,这只是主观臆测,下面实际计算下这个具体过程。

过程1

对于m=1m=1,在权值分布为D1D_1(10个数据,每个数据的权值皆初始化为0.1)的训练数据上,vv表示阈值,经过计算可得:

  • v=2.5v=2.5时,误差率为0.3
    X<2.5X \lt 2.5时取1,X>2.5X \gt 2.5时取-1,则6 7 8分错,误差率为0.3;
  • v=5.5v=5.5时,误差率最低为0.4
    X<5.5X \lt 5.5时取1,X>5.5X \gt 5.5时取-1,则3 4 5 6 7 8皆分错,误差率0.6大于0.5,不可取。故令X>5.5X \gt 5.5时取1,X<5.5X \lt 5.5时取-1,则0 1 2 9分错,误差率为0.4;
  • v=8.5v=8.5时,误差率为0.3
    X<8.5X \lt 8.5时取1,X>8.5X \gt 8.5时取-1,则3 4 5分错,误差率为0.3。

可见,无论v=2.5v=2.5,还是v=8.5v=8.5,总得分错3个样本,故可任取其中任意一个如2.5,得到第一个基本分类器为:
G1(x)={1if x<2.51if x>2.5 G_1(x) = \begin{cases} 1 & \text{if } x \lt 2.5 \\ -1 & \text{if } x \gt 2.5 \end{cases}
在样本集中:

  • 0 1 2对应的类(YY)是1,因它们本身都小于2.5,所以被G1(x)G_1(x)分在了相应的类“1”中,分对了。
  • 3 4 5本身对应的类(YY)是-1,因它们本身都大于2.5,所以被G1(x)G_1(x)分在了相应的类“-1”中,分对了。
  • 但6 7 8本身对应类(YY)是1,却因它们本身大于2.5而被G1(x)G_1(x)分在了类"-1"中,所以这3个样本被分错了。
  • 9本身对应的类(YY)是-1,因它本身大于2.5,所以被G1(x)G_1(x)分在了相应的类“-1”中,分对了。

从而得到G1(x)G_1(x)在训练数据集上的误差率(被G1(x)G_1(x)误分类样本“6 7 8”的权值之和)e1=P(G1(xi)yi)=30.1=0.3e_1=P(G_1(x_i)\neq y_i) = 3*0.1 = 0.3

然后根据误差率e1e_1计算G1G_1的系数:
α1=12ln1e1e1=0.4236 \alpha_1=\frac{1}{2}ln\frac{1-e_1}{e_1}=0.4236
这个a1a_1代表G1(x)G_1(x)在最终的分类函数中所占的权重,为0.4236。
接着更新训练数据的权值分布,用于下一轮迭代:
Dm+1=(ωm+1,1,ωm+1,2,...,ωm+1,N)ωm+1,i=ωmiZmeαmyiGm(xi) D_{m+1}=(\omega_{m+1,1},\omega_{m+1,2},...,\omega_{m+1,N}) \\ \omega_{m+1,i}=\frac{\omega_{mi}}{Z_m}e^{-\alpha_my_iG_m(x_i)}
值得一提的是,由权值更新的公式可知,每个样本的新权值是变大还是变小,取决于它是被分错还是被分正确。即如果某个样本被分错了,则yiGm(xi)y_i * G_m(x_i)为负,负负得正,结果使得整个式子变大(样本权值变大),否则变小。

第一轮迭代后,最后得到各个数据新的权值分布:
D2=(0.0715,0.0715,0.0715,0.0715,0.0715,0.0715,0.1666,0.1666,0.1666,0.0715)D_2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715, \underline{0.1666}, \underline{0.1666}, \underline{0.1666}, 0.0715)
由此可以看出,因为样本中是数据“6 7 8”被G1(x)G_1(x)分错了,所以它们的权值由之前的0.10.1增大到0.16660.1666,反之,其它数据皆被分正确,所以它们的权值皆由之前的0.10.1减小到0.07150.0715

从而得到分类函数

f1(x)=α1G1(x)=0.4236G1(x)f_1(x)= \alpha_1*G_1(x) = 0.4236G_1(x)

此时,得到的第一个基本分类器sign(f1(x))在训练数据集上有3个误分类点(即6 7 8)。
从上述第一轮的整个迭代过程可以看出:被误分类样本的权值之和影响误差率,误差率影响基本分类器在最终分类器中所占的权重。

过程2

对于m=2m=2,在权值分布为D2=(0.0715,0.0715,0.0715,0.0715,0.0715,0.0715,0.1666,0.1666,0.1666,0.0715)D_2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.1666, 0.1666, 0.1666, 0.0715)的训练数据上,经过计算可得:

  • v=2.5v=2.5时,误差率为0.1666×30.1666\times 3
    x<2.5x < 2.5时取1,x>2.5x > 2.5时取-1,则6 7 8分错,误差率为0.1666×30.1666\times 3
  • v=5.5v=5.5时,误差率最低为0.0715×40.0715\times 4
    x>5.5x > 5.5时取1,x<5.5x < 5.5时取-1,则0 1 2 9分错,误差率为0.0715×3+0.07150.0715\times 3 + 0.0715
  • v=8.5v=8.5时,误差率为0.0715×30.0715\times 3
    x<8.5x < 8.5时取1,x>8.5x > 8.5时取-1,则3 4 5分错,误差率为0.0715×30.0715\times 3
    所以,v=8.5v=8.5时,误差率最低,故得到第二个基本分类器为:
    G2(x)={1if x<8.51if x>8.5 G_2(x) = \begin{cases} 1 & \text{if } x \lt 8.5 \\ -1 & \text{if } x \gt 8.5 \end{cases}
    很明显,G2(x)G_2(x)把样本“3 4 5”分错了,根据D2D_2可知它们的权值为0.0715,0.0715,0.07150.0715, 0.0715, 0.0715,所以G2(x)G_2(x)在训练数据集上的误差率e2=P(G2(xi)yi)=0.0715×3=0.2143e_2=P(G_2(x_i)\neq y_i) = 0.0715 \times 3 = 0.2143
    G2G_2的系数为:
    α2=12ln1e2e2=0.6496 \alpha_2=\frac{1}{2}ln\frac{1-e_2}{e_2}=0.6496
    更新训练数据的权值分布:
    D3=(0.0455,0.0455,0.0455,0.1667,0.1667,0.1667,0.1060,0.1060,0.1060,0.0455)D_3 = (0.0455, 0.0455, 0.0455, \underline{0.1667}, \underline{0.1667}, \underline{0.1667}, 0.1060, 0.1060, 0.1060, 0.0455)。被分错的样本“3 4 5”的权值变大,其它被分对的样本的权值变小。
    此时得到:
    f2(x)=0.4236G1(x)+0.6496G2(x) f_2(x)=0.4236G_1(x) + 0.6496G_2(x)
    此时,得到的分类器sign(f2(x))sign(f_2(x))在训练数据集上有3个误分类点(即3 4 5)。

过程3

对于m=3,在权值分布为D3=(0.0455,0.0455,0.0455,0.1667,0.1667,0.01667,0.1060,0.1060,0.1060,0.0455)D_3 = (0.0455, 0.0455, 0.0455, 0.1667, 0.1667, 0.01667, 0.1060, 0.1060, 0.1060, 0.0455)的训练数据上,经过计算可得:

  • v=2.5v=2.5时,误差率为0.1060×30.1060\times 3
    x<2.5x < 2.5时取1,x>2.5x > 2.5时取-1,则6 7 8分错,误差率为0.1060×30.1060\times 3
  • v=5.5v=5.5时,误差率最低为0.0455×40.0455\times 4
    x>5.5x > 5.5时取1,x<5.5x < 5.5时取-1,则0 1 2 9分错,误差率为0.0455×3+0.07150.0455\times 3 + 0.0715
  • v=8.5v=8.5时,误差率为0.1667×30.1667\times 3
    x<8.5x < 8.5时取1,x>8.5x > 8.5时取-1,则3 4 5分错,误差率为0.1667×30.1667\times 3

所以阈值v=5.5v=5.5时误差率最低,故第三个基本分类器为:
G3(x)={1if x>5.51if x<5.5 G_3(x) = \begin{cases} 1 & \text{if } x \gt 5.5 \\ -1 & \text{if } x \lt 5.5 \end{cases}
此时,被误分类的样本是:0 1 2 9,这4个样本所对应的权值皆为0.04550.0455,所以G3(x)G_3(x)在训练数据集上的误差率e3=P(G3(xi)yi)=0.0455×4=0.1820e_3 = P(G_3(x_i)\neq y_i) = 0.0455\times 4 = 0.1820
计算G3G_3的系数:
α3=12ln1e3e3=0.7514 \alpha_3=\frac{1}{2}ln\frac{1-e_3}{e_3}=0.7514
更新训练数据的权值分布:
D4=(0.125,0.125,0.125,0.102,0.102,0.102,0.065,0.065,0.065,0.125)D_4 = (\underline{0.125}, \underline{0.125}, \underline{0.125}, 0.102, 0.102, 0.102, 0.065, 0.065, 0.065, \underline{0.125})。被分错的样本“0 1 2 9”的权值变大,其它被分对的样本的权值变小。
得到:
f3(x)=0.4236G1(x)+0.6496G2(x)+0.7514G3(x) f_3(x)=0.4236G_1(x) + 0.6496G_2(x)+0.7514G_3(x)
此时,得到的分类器sign(f3(x))sign(f_3(x))在训练数据集上有0个误分类点。至此,整个训练过程结束。
现在,咱们来总结下3轮迭代下来,各个样本权值和误差率的变化,如下所示(其中,样本权值DD中加了下划线的表示在上一轮中被分错的样本的新权值):

  • 训练之前
    各个样本的权值被初始化为
    D1=(0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1)D_1 = (0.1, 0.1,0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1)
  • 第一轮迭代中
    样本“6 7 8”被分错,对应的误差率为e1=P(G1(xi)yi)=3×0.1=0.3e_1=P(G_1(x_i)≠y_i) = 3\times 0.1 = 0.3
    此第一个基本分类器在最终的分类器中所占的权重为α1=0.4236\alpha_1 = 0.4236
    样本新的权值为
    D2=(0.0715,0.0715,0.0715,0.0715,0.0715,0.0715,0.1666,0.1666,0.1666,0.0715)D_2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715, \underline{0.1666}, \underline{0.1666}, \underline{0.1666}, 0.0715)
  • 第二轮迭代中
    样本“3 4 5”被分错,对应的误差率为e2=P(G2(xi)yi)=0.0715×3=0.2143e_2=P(G_2(x_i)≠y_i) = 0.0715\times 3 = 0.2143
    此第二个基本分类器在最终的分类器中所占的权重为α2=0.6496\alpha_2 = 0.6496
    样本新的权值为
    D3=(0.0455,0.0455,0.0455,0.1667,0.1667,0.1667,0.1060,0.1060,0.1060,0.0455)D_3 = (0.0455, 0.0455, 0.0455, \underline{0.1667}, \underline{0.1667}, \underline{0.1667}, 0.1060, 0.1060, 0.1060, 0.0455)
  • 第三轮迭代中
    样本“0 1 2 9”被分错,对应的误差率为e3=P(G3(xi)yi)=0.0455×4=0.1820e_3 = P(G_3(x_i)≠y_i) = 0.0455\times 4 = 0.1820
    此第三个基本分类器在最终的分类器中所占的权重为α3=0.7514\alpha_3 = 0.7514
    样本新的权值为
    D4=(0.125,0.125,0.125,0.102,0.102,0.102,0.065,0.065,0.065,0.125)D_4 = (\underline{0.125}, \underline{0.125}, \underline{0.125}, 0.102, 0.102, 0.102, 0.065, 0.065, 0.065, \underline{0.125})

从上述过程中可以发现,如果某些个样本被分错,它们在下一轮迭代中的权值将被增大,同时,其它被分对的样本在下一轮迭代中的权值将被减小。就这样,分错样本权值增大,分对样本权值变小,而在下一轮迭代中,总是选取让误差率最低的阈值来设计基本分类器,所以误差率ee(所有被Gm(x)G_m(x)误分类样本的权值之和)不断降低。
综上,将上面计算得到的α1\alpha_1α2\alpha_2α3\alpha_3各值代入G(x)G(x)中,G(x)=sign[f3(x)]=sign[α1×G1(x)+α2×G2(x)+α3×G3(x)]G(x) = sign[f_3(x)] = sign[ \alpha_1 \times G_1(x) + \alpha_2\times G_2(x) + \alpha_3 \times G_3(x) ],得到最终的分类器为:
G(x)=sign[f3(x)]=sign[0.4236G1(x)+0.6496G2(x)+0.7514G3(x)] G(x) = sign[f_3(x)] = sign[ 0.4236G_1(x) + 0.6496G_2(x)+0.7514G_3(x) ]

3 Adaboost的优缺点

优点

  • 精度高
  • 灵活,可以使用多种方法构造子分类器,Adaboost只是提供一个框架
  • 可理解,使用简单分类器的计算结果更容易理解,并且子分类器构建相对简单
  • 无需做特征筛选
  • 无需担心过拟合

缺点

主要的缺点是对异常样本非常敏感,异常样本在迭代中可能会获得较高的权重,最终影响预测准确性。

文章转自:https://blog.****.net/v_july_v/article/details/40718799