手把手教你AdaBoost

集成学习

个体学习器:精确率仅高于\frac{1}{2} 的学习器。(随机判断一个二分类的精确率为\frac{1}{2} ,精确率高于\frac{1}{2} 的学习器才有意义,因为这样才有信息获取)

集成学习:结合多个个体学习器(弱学习器)从而获得精确率很高的学习器(强学习器)。

集成学习示意图(源于周志华的《机器学习》)

Boosting

Boosting是集成学习中的一种方法,意为“提升”。提升是一个逐步优化集成学习器的过程,即每个个体学习器都在弥补集成学习器的欠缺,从而达到整体的优化。下面介绍Boosting的经典算法AdaBoost。

AdaBoost

通过每次降低个体学习器的分类误差,加大效果好的个体学习器的重要性,得到最终的集成学习器。

集成学习器的形式:G(x)=sign[f(x)]=sign[ \alpha_1G_1 (x)+\alpha_2 G_2 (x)+\cdot \cdot \cdot +\alpha_n G_n (x)]

(sign(x)为符号函数,x>0输出1,x<0输出-1)

G_i(x)代表个体学习器,\alpha_i表示该个体学习器的重要性)

下面直接通过例子去理解AdaBoost算法。

(下面的例子与解法来源于李航的《统计学习方法》)

给定如下表所示训练数据。假设个体学习器由x(输入)和y(输出)产生,其阈值v(判定正反例的分界线)使该分类器在训练数据集上分类误差率最低。(y=1为正例,y=-1为反例)

第一个个体学习器:

我们首先认为x_i(i=1,2,…,10)的权重是一样的,即每一个数据同等重要。(权重是用来计算误差的)

D_1

(a)在权值分布为D_1的训练数据上,阈值v取2.5(红线)时分类误差率最低(此时x=6,7,8的数据被错分为反例,误差为它们的权重之和e_1=0.1+0.1+0.1=0.3,误差率小于\frac{1}{2} 才有意义),故个体学习器为\[G_1(x)=\begin{cases}
1&\text{$x<2.5$},\\
-1&
\text{$x>2.5$}.
\end{cases}\]

(b)根据误差e_1计算系数\alpha_1=0.4236(公式:\alpha_i=\frac{1}{2} log\frac{1-e_i}{e_i} ,可以发现只有当e_i<\frac{1}{2} 时,\alpha_i>0,这样个体学习器才是有意义的)


(c)更新训练数据的权值分布(公式:w_{m+1,i}=\frac{w_{m,i}}{Z_m}exp \left( -\alpha_my_iG_m\left( x_i \right)  \right) , i=1,2,\cdot \cdot \cdot,NZ_m=\sum_{i=1}^{N}{w_{m,i}exp\left( -\alpha_my_iG_m\left( x_i \right)  \right) } ,Z_m是为了保证每次权值总和为1)


(通过指数损失函数exp\left( x \right) 调整权重,分类正确的降低权重(y_iG_m\left( x_i \right)同号则y_iG_m\left( x_i \right)>0 -\alpha_my_iG_m\left( x_i \right)<0 ),分类错误的增加权重):

D_2(权重之和始终为1)


可以看到x=6,7,8的数据的权重变大了,而其他数据的权重降低了,这是希望能把之前经常分类错误(经常分类错误会出现权重不断变大)的数据能在下一个个体学习器分类正确(记住:权重是用来计算误差的,为了降低误差,选择阈值时会倾向把权重大的分类正确)

f_1(x)=\alpha_1G_1(x)=0.4236G_1(x)\[0.4236G_1(x)=\begin{cases}
0.4236*1&\text{$x<2.5$},\\
0.4236*(-1)&
\text{$x>2.5$}.
\end{cases}\]
\[sign[f_1(x)]=\begin{cases}
1&\text{$x<2.5$},\\
-1&
\text{$x>2.5$}.
\end{cases}\]

集成学习器sign[f_1(x)](第一次集成,只有一个个体学习器)在训练数据集上有3个误分类点


第二个个体学习器:

D_2

(a)在权值分布为D_2的训练数据上,阈值v取8.5时分类误差率最低(此时x=3,4,5的数据被错分为正例,误差为它们的权重之和e_2=0.07143+0.07143+0.07143=0.2143,误差率降低了!),故个体学习器为\[G_2(x)=\begin{cases}
1&\text{$x<8.5$},\\
-1&
\text{$x>8.5$}.
\end{cases}\]

(b)根据误差e_2计算系数\alpha_2=0.6496

(c)更新训练数据的权值分布(在D_2的基础上调整D_3,分类正确的降低权重,分类错误的增加权重):

D_3

对比D_2可以看到x=3,4,5的数据的权重变大了,而其他权重降低了。

\[0.4236G_1(x)=\begin{cases}
0.4236*1&\text{$x<2.5$},\\
0.4236*(-1)&
\text{$x>2.5$}.
\end{cases}\]\[0.6496G_2(x)=\begin{cases}
0.6496*1&\text{$x<8.5$},\\
0.6496*(-1)&
\text{$x>8.5$}.
\end{cases}\]


f_2(x)=\alpha_1G_1(x)+\alpha_2G_2(x)=0.4236G_1(x)+0.6496G_2(x)

\[f_2(x)=\begin{cases}
0.4236*1+0.6496*1=1.0732&\text{$x<2.5$},\\
0.4236*(-1)+0.6496*1=0.226&
\text{$2.5<x<8.5$},\\
0.6496*(-1)=-0.6496&
\text{$x>8.5$},
\end{cases}\](注意:x<2.5时,也<8.5)

\[sign[f_2(x)]=\begin{cases}
1&\text{$x<8.5$},\\
-1&\text{$x>8.5$}.
\end{cases}\]

分类器sign[f_2(x)]在训练数据集上有3个误分类点


第三个个体学习器:

D_3

(a)在权值分布为D_3的训练数据上,阈值v取5.5时分类误差率最低(e_3=0.1820,误差率又降低了!x=0,1,2,9被分类错误),故个体学习器为\[G_3(x)=\begin{cases}
-1&\text{$x<5.5$},\\
1&
\text{$x>5.5$}.
\end{cases}\]


(b)根据误差e_3计算系数\alpha_3=0.7514

(c)更新训练数据的权值分布:

D_4
f_3(x)=\alpha_1G_1(x)+\alpha_2G_2(x)+\alpha_3G_3(x)
\[f_3(x)=\begin{cases}
0.3218&\text{$x<2.5$},\\
-0.5254&\text{$2.5<x<5.5$},\\
0.9774&\text{$5.5<x<8.5$},\\
-0.3218&\text{$x>8.5$}.
\end{cases}\]
\[sign[f_3(x)]=\begin{cases}
1&\text{$x<2.5$},\\
-1&\text{$2.5<x<5.5$},\\
1&\text{$5.5<x<8.5$},\\
-1&\text{$x>8.5$}.
\end{cases}\]

(自己算一算吧)

最终结果:

分类器sign[f_3(x)]在训练数据集上有0个误分类点(amazing!)


AdaBoost为何如此神奇?

对比三个个体学习器我们可以发现,权值很低的数据从侧面说明,它们在前面的学习器经常被分类正确,也就是说它们被分类正确的票数就比较多(\alpha 相当于每个分类器的票数),那么之后的个体学习器把它们分类错也没所谓啦,反正总票数是分类正确的票数多就可以了。例如x=1,前面两次分类对了,获得正确票数0.4236+0.6496=1.0732,第三次错了,获得错误票数0.7514,正确票数多,最终还是分类正确了。为了想办法让分类错误的数据变为分类正确的,后面的个体学习器也在努力。如x=6,第一次分类错误的票数为0.4236,第二次分类正确的票数0.6496,可以看到为了让前面分类错误的数据变为分类正确的,后面个体学习器的重要性(\alpha )需要比前面的大。

题外话

这是我第一次写博客,发现写个小东西还挺花时间的。AdaBoost这个例子是以二分类为例的,还有回归问题的AdaBoost(每个个体学习器去拟合残差)以后再考虑写吧。前向分步算法(解释逐步调优达到整体调优的原因)、提升数(个体学习器为决策树)、梯度提升(Gradient Boosting,其实就是损失函数用梯度下降的方法去解决)有点懒得写了,推荐看看李航的《统计学习方法》。

编辑于 2017-05-28