机器学习实战刻意练习 —— Task 04. AdaBoost

机器学习实战刻意练习

第 1 周任务
  分类问题:K-邻近算法
  分类问题:决策树

第 2 周任务
  分类问题:朴素贝叶斯
  分类问题:逻辑回归

第 3 周任务
  分类问题:支持向量机

第 4 周任务
  分类问题:AdaBoost

第 5 周任务
  回归问题:线性回归、岭回归、套索方法、逐步回归等
  回归问题:树回归

第 6 周任务
  聚类问题:K均值聚类
  相关问题:Apriori

第 7 周任务
  相关问题:FP-Growth

第 8 周任务
  简化数据:PCA主成分分析
  简化数据:SVD奇异值分解
    



AdaBoost

文章目录

    • 1.简介
    • 2.Boosting提升算法
    • 3. AdaBoost
      •  3.1. 原理理解
      •  3.1.实例
      • 3.2. 算法流程
    • 参考资料



1.简介

  Boosting,也称为增强学习或提升法,是一种重要的集成学习技术,能够将预测精度仅比随机猜度略高的弱学习器增强为预测精度高的强学习器,这在直接构造强学习器非常困难的情况下,为学习算法的设计提供了一种有效的新思路和新方法。作为一种元算法框架,Boosting几乎可以应用于所有目前流行的机器学习算法以进一步加强原算法的预测精度,应用十分广泛,产生了极大的影响。而AdaBoost正是其中最成功的代表,被评为数据挖掘十大算法之一。在AdaBoost提出至今的十几年间,机器学习领域的诸多知名学者不断投入到算法相关理论的研究中去,扎实的理论为AdaBoost算法的成功应用打下了坚实的基础。AdaBoost的成功不仅仅在于它是一种有效的学习算法,还在于1)它让Boosting从最初的猜想变成一种真正具有实用价值的算法;2)算法采用的一些技巧,如:打破原有样本分布,也为其他统计学习算法的设计带来了重要的启示;3)相关理论研究成果极大地促进了集成学习的发展。



2.Boosting提升算法

  AdaBoost是典型的Boosting算法,属于Boosting家族的一员。在说AdaBoost之前,先说说Boosting提升算法。Boosting算法是将“弱学习算法“提升为“强学习算法”的过程,主要思想是“三个臭皮匠顶个诸葛亮”。一般来说,找到弱学习算法要相对容易一些,然后通过反复学习得到一系列弱分类器,组合这些弱分类器得到一个强分类器。Boosting算法要涉及到两个部分,加法模型和前向分步算法。加法模型就是说强分类器由一系列弱分类器线性相加而成。一般组合形式如下:

F M ( x ; P ) = ∑ m = 1 n β m h ( x ; a m ) F_M(x;P)=\sum_{m=1}^nβ_mh(x;a_m) FM(x;P)=m=1nβmh(x;am)

  其中, h ( x ; a m ) h(x;a_m) h(x;am) 就是一个个的弱分类器, a m a_m am是弱分类器学习到的最优参数, β m β_m βm就是弱学习在强分类器中所占比重,P是所有 a m a_m am β m β_m βm的组合。这些弱分类器线性相加组成强分类器。

  前向分步就是说在训练过程中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的。也就是可以写成这样的形式:

F m ( x ) = F m − 1 ( x ) + β m h m ( x ; a m ) F_m (x)=F_{m-1}(x)+ β_mh_m (x;a_m) Fm(x)=Fm1(x)+βmhm(x;am)

  由于采用的损失函数不同,Boosting算法也因此有了不同的类型,AdaBoost就是损失函数为指数损失的Boosting算法。


3. AdaBoost

 3.1. 原理理解

  基于Boosting的理解,对于AdaBoost,我们要搞清楚两点:

  1. 每一次迭代的弱学习 h ( x ; a m ) h(x;a_m) h(x;am)有何不一样,如何学习?
  2. 弱分类器权值 β m β_m βm如何确定?

  对于第一个问题,AdaBoost改变了训练数据的权值,也就是样本的概率分布,其思想是将关注点放在被错误分类的样本上,减小上一轮被正确分类的样本权值,提高那些被错误分类的样本权值。然后,再根据所采用的一些基本机器学习算法进行学习,比如逻辑回归。

  对于第二个问题,AdaBoost采用加权多数表决的方法,加大分类误差率小的弱分类器的权重,减小分类误差率大的弱分类器的权重。这个很好理解,正确率高分得好的弱分类器在强分类器中当然应该有较大的发言权。

 3.1.实例

  为了加深理解,我们来举一个例子。

  有如下的训练样本,我们需要构建强分类器对其进行分类。x是特征,y是标签。

序号 1 2 3 4 5 6 7 8 9 10
x 0 1 2 3 4 5 6 7 8 9
y 1 1 1 -1 -1 -1 1 1 1 -1

  令权值分布 D 1 = ( w 1 , 1 , w 1 , 2 , … , w 1 , 10 ) D_1=(w_{1,1},w_{1,2},…,w_{1,10}) D1=(w1,1,w1,2,,w1,10)

  并假设一开始的权值分布是均匀分布: w 1 , i = 0.1 , i = 1 , 2 , … , 10 w_{1,i}=0.1,i=1,2,…,10 w1,i=0.1i=1,2,,10

  现在开始训练第一个弱分类器。我们发现阈值取2.5时分类误差率最低,得到弱分类器为: G 1 ( x ) = { 1 ,        x < 2.5 − 1 ,    x > 2.5 G_1(x)=\left\{\begin{matrix}1, \, \, \, \, \, \, x<2.5 \\-1, \, \, x>2.5 \end{matrix}\right. G1(x)={1,x<2.51,x>2.5

  当然,也可以用别的弱分类器,只要误差率最低即可。这里为了方便,用了分段函数。得到了分类误差率 e 1 = 0.3 e_1=0.3 e1=0.3

  第二步计算 G 1 ( x ) G_1(x) G1(x)在强分类器中的系数 α 1 = 1 2 l o g 1 − e 1 e 1 = 0.4236 α_1=\frac{1}{2} log\frac{ 1-e_1}{e_1}=0.4236 α1=21loge11e1=0.4236,这个公式先放在这里,下面再做推导。

  第三步更新样本的权值分布,用于下一轮迭代训练。由公式:

w 2 , i = w 1 , i z 1 e x p ⁡ ( − α 1 y i G 1 ( x i ) ) , i = 1 , 2 , … , 10 w_{2,i}=\frac{w_{1,i}}{z_1}exp⁡(-α_1 y_i G_1 (x_i )),i=1,2,…,10 w2,i=z1w1,iexp(α1yiG1(xi))i=1,2,,10

  得到新的权值分布,从各0.1变成了: D 2 = ( 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) D2=(0.0715,0.0715,0.0715,0.0715,0.0715,0.0715,0.1666,0.1666,0.1666,0.0715)

  可以看出,被分类正确的样本权值减小了,被错误分类的样本权值提高了。

  第四步得到第一轮迭代的强分类器: s i g n ( F 1 ( x ) ) = s i g n ( 0.4236 G 1 ( x ) ) sign(F_1(x))=sign(0.4236G_1(x)) sign(F1(x))=sign(0.4236G1(x))

  以此类推,经过第二轮……第N轮,迭代多次直至得到最终的强分类器。迭代范围可以自己定义,比如限定收敛阈值,分类误差率小于某一个值就停止迭代,比如限定迭代次数,迭代1000次停止。这里数据简单,在第3轮迭代时,得到强分类器:

s i g n ( F 3 ( x ) ) = s i g n ( 0.4236 G 1 ( x ) + 0.6496 G 2 ( x ) + 0.7514 G 3 ( x ) ) sign(F_3(x))=sign(0.4236G_1(x)+0.6496G_2(x)+0.7514G_3(x)) sign(F3(x))=sign(0.4236G1(x)+0.6496G2(x)+0.7514G3(x))

的分类误差率为0,结束迭代。

   F ( x ) = s i g n ( F 3 ( x ) ) F(x)=sign(F_3(x)) F(x)=sign(F3(x))就是最终的强分类器。

3.2. 算法流程

  总结一下,得到 A d a B o o s t AdaBoost AdaBoost的算法流程:

  输入:训练数据集 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 , y i ∈ Y = − 1 , 1 x_i∈X⊆R^n,y_i∈Y=−1,1 xiXRnyiY=1,1,迭代次数 M M M

  1. 初始化训练样本的权值分布: 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
  2. 对于 m = 1 , 2 , … , M m=1,2,…,M m=1,2,,M
      ( a ) 使用具有权值分布 D m D_m Dm的训练数据集进行学习,得到弱分类器 G m ( x ) G_m(x) Gm(x)
      ( b ) 计算 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=1Nwm,iI(Gm(xi)=yi)
      ( c ) 计算 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=21logem1em
      ( d ) 更新训练数据集的权值分布(这里, 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=1Nwm,iexp(αmyiGm(xi))

  1. 得到最终分类器:
    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=1NαmGm(x))

未完待续。。。


参考资料

  • https://www.cnblogs.com/ScorpioLu/p/8295990.html
  • https://louisscorpio.github.io/2017/11/28/%E4%BB%A3%E7%A0%81%E5%AE%9E%E6%88%98%E4%B9%8BAdaBoost/

你可能感兴趣的:(机器学习,Python)