AdaBoost

思想~适应~步骤

一、AdaBoost简介

  AdaBoost是adaptive boosting的缩写,思想就是:复杂任务,多个专家综合判断,比其中任何一个专家单独判断要好,实际上就是‘三个臭皮匠顶个诸葛亮’的道理

  它的自适应在于:前一个基本分类器错误分类的样本的权值会增大,而正确分类的样本的权值会减小,权值更新的样本集再次用来训练下一个基本分类器,如此迭代。

  Adaboost算法可以简述为三个步骤:

  (1)首先,是初始化训练数据的权值分布D,假设有N个训练样本数据,则每一个训练样本最开始时,都被赋予相同的权值:w1=1/N。

  (2)然后,训练弱分类器hi。具体训练过程中是:如果某个训练样本点,被弱分类器hi准确地分类,那么在构造下一个训练集中,它对应的权值要减小;相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。

  (3)最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。

  换而言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。

 

二、AdaBoost算法过程

    给定训练数据集:(x1,y1)......(xn,yn),其中yi{-1,1},表示训练样本的类别标签,i=1,...,N。Adaboost的目的就是从训练数据中学习一系列弱分类器或基本分类器,然后将这些弱分类器组合成一个强分类器,

 相关符号定义: 

  Dt(i):训练样本集的权值分布

  Wi:每个训练样本得权值大小

  h:弱分类器

  H:基本分类器

  Hfinal:最终的强分类器

  e:误差率

  at:弱分类器的权重

  Adaboost的算法流程如下:

  (1)初始化训练集的权值分布,wi=1/N,训练集的初始权值分布:D1(i) = (w1,w2,...,wn) = (1/N,1/N,...,1/N)

  (2)进行迭代,t = 1,2,3,...,T:

    a) 选取一个当前误差率最低的弱分类器h作为第t个基本分类器Ht,并计算弱分类器ht:X -> {-1,1},该弱分类器在分布Dt上的误差为:Ht(x)在训练集上的误差率et就是被Ht(x)误分类样本的权值之和,P表示概率,误分类的概率,I为指示函数,满足错误分类的样本得w之和

 

    b) 该弱分类器在最终分类器中所占权重:

 

     c) 更新训练集的权值分布Dt+1:exp指数函数,e的多少次方

   (3)组合各个弱分类器:

  (4)通过符号函数sign的作用,得到一个强分类器:

 

  相关说明:

    因为权重更新依赖于a,而a依赖于错误率e,对于权重更新公式:

 

    

    当样本被误分类时yiHt(xi)=-1:

    

 

     当样本被正确分类时yiHt(xi)=1:

    综合上面的推导,可得样本分错与分对时,其权值更新的公式为:

 

 

三、实例讲解

  例:给定如图所示的训练样本,弱分类器采用平行于坐标轴的直线,用Adaboost算法的实现强分类过程:

  

 数据分析:

     将这10个样本作为训练数据,根据 X 和Y 的对应关系,可把这10个数据分为两类,图中用“+”表示类别1,用“O”表示类别-1。本例使用水平或者垂直的直线作为分类器,图中已经给出了三个弱分类器,即:

 

  

 初始化:

     首先需要初始化训练样本数据的权值分布,每一个训练样本最开始时都被赋予相同的权值:wi=1/N,这样训练样本集的初始权值分布D1(i):D1=[0.1,  0.1, 0.1, 0.1, 0.1, 0.1,0.1, 0.1, 0.1, 0.1]

   第1次迭代t=1:权值分布D1的情况下,取已知的三个弱分类器h1h2h3中误差率最小的分类器作为第1个基本分类器H1(x)(三个弱分类器的误差率都是0.3,那就取第1个吧)

   

   在分类器H1(x)=h1情况下,样本点“5 7 8”被错分,因此基本分类器H1(x)的误差率为:

   可见,被误分类样本的权值之和影响误差率e,误差率e影响基本分类器在最终分类器中所占的权重α

   然后,更新训练样本数据的权值分布,用于下一轮迭代,对于正确分类的训练样本“1 2 3 4 6 9 10”(共7个)的权值更新为:

 

   这样,第1轮迭代后,最后得到各个样本数据新的权值分布:D2=[1/14,1/14,1/14,1/14,1/6,1/14,1/6,1/6,1/14,1/14],由于样本数据“5 7 8”被H1(x)分错了,所以它们的权值由之前的0.1增大到1/6;反之,其它数据皆被分正确,所以它们的权值皆由之前的0.1减小到1/14,下表给出了权值分布的变换情况:

   可得分类函数:f1(x)= α1H1(x) = 0.4236H1(x)。此时,组合一个基本分类器sign(f1(x))作为强分类器在训练数据集上有3个误分类点(即5 7 8),此时强分类器的训练错误为:0.3

 

  第二次迭代t=2:

   在权值分布D2的情况下,再取三个弱分类器h1、h2和h3中误差率最小的分类器作为第2个基本分类器H2(x):

    ①当取弱分类器h1=X1=2.5时,此时被错分的样本点为“5 7 8”:误差率e=1/6+1/6+1/6=3/6=1/2;

    ②当取弱分类器h2=X1=8.5时,此时被错分的样本点为“3 4 6”:误差率e=1/14+1/14+1/14=3/14;

    ③当取弱分类器h3=X2=6.5时,此时被错分的样本点为“1 2 9”:误差率e=1/14+1/14+1/14=3/14;

   因此,取当前最小的分类器h2作为第2个基本分类器H2(x):

   显然,H2(x)把样本“3 4 6”分错了,根据D2可知它们的权值为D2(3)=1/14,D2(4)=1/14, D2(6)=1/14,所以H2(x)在训练数据集上的误差率:

   

    这样,第2轮迭代后,最后得到各个样本数据新的权值分布:D3=[1/22,1/22,1/6,1/6,7/66,1/6,7/66,7/66,1/22,1/22],下表给出了权值分布的变换情况:

   可得分类函数:f2(x)=0.4236H1(x) + 0.6496H2(x)。此时,组合两个基本分类器sign(f2(x))作为强分类器在训练数据集上有3个误分类点(即3 4 6),此时强分类器的训练错误为:0.3

  第三次迭代t=3:

   在权值分布D3的情况下,再取三个弱分类器h1、h2和h3中误差率最小的分类器作为第3个基本分类器H3(x):

    ①当取弱分类器h1=X1=2.5时,此时被错分的样本点为“5 7 8”:误差率e=7/66+7/66+7/66=7/22;

    ②当取弱分类器h2=X1=8.5时,此时被错分的样本点为“3 4 6”:误差率e=1/6+1/6+1/6=1/2=0.5;

    ③当取弱分类器h3=X2=6.5时,此时被错分的样本点为“1 2 9”:误差率e=1/22+1/22+1/22=3/22;

 

    因此,取当前最小的分类器h3作为第3个基本分类器H3(x):

   

  这样,第3轮迭代后,得到各个样本数据新的权值分布为:D4=[1/6,1/6,11/114,11/114,7/114,11/114,7/114,7/114,1/6,1/38],下表给出了权值分布的变换情况:

   可得分类函数:f3(x)=0.4236H1(x) + 0.6496H2(x)+0.9229H3(x)。此时,组合三个基本分类器sign(f3(x))作为强分类器,在训练数据集上有0个误分类点。至此,整个训练过程结束。

   整合所有分类器,可得最终的强分类器为:

 

   这个强分类器Hfinal对训练样本的错误率为0!

 

四、AdaBoost的优点和缺点

 优点

     (1)Adaboost提供一种框架,在框架内可以使用各种方法构建子分类器。可以使用简单的弱分类器,不用对特征进行筛选,也不存在过拟合的现象。

     (2)Adaboost算法不需要弱分类器的先验知识,最后得到的强分类器的分类精度依赖于所有弱分类器。无论是应用于人造数据还是真实数据,Adaboost都能显著的提高学习精度。

     (3)Adaboost算法不需要预先知道弱分类器的错误率上限,且最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度,可以深挖分类器的能力。Adaboost可以根据弱分类器的反馈,自适应地调整假定的错误率,执行的效率高。

     (4)Adaboost对同一个训练样本集训练不同的弱分类器,按照一定的方法把这些弱分类器集合起来,构造一个分类能力很强的强分类器,即“三个臭皮匠赛过一个诸葛亮”。

 缺点:

  在Adaboost训练过程中,Adaboost会使得难于分类样本的权值呈指数增长,训练将会过于偏向这类困难的样本,导致Adaboost算法易受噪声干扰。此外,Adaboost依赖于弱分类器,而弱分类器的训练时间往往很长。

 五、本文参考网址

  https://blog.csdn.net/guyuealian/article/details/70995333

六、小结

 基本原理:弱分类器(一般选择单层决策树)组合成强分类器

 单层决策树:选择一个特征的某个阈值,即一个决策点

 两个权重:

  数据权重:主要用于弱分类器寻找分类误差最小的决策点,找到该决策点后计算出弱分类器的权重。为何需要数据权重呢?如果数据权重不变化的话,那么分类误差最小的决策点应该是唯一的,则每轮迭代都不会变化,数据权重变化了,决策点就不是固定的了,如:

  一共10个点,每个点权重是0.1,分错3个错误率就是0.3;现在每个点的权重不一样:\([0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.91]\),如果分错第一个点,错误率是0.01,但是如果分错最后一个点,错误率就是0.91,那么分类决策点就不一样了,在选择分类决策点的时候,要求最小误差的话自然尽量把权重大的样本分对才能降低误差率。

  弱分类器权重:根据其分类错误率计算出来的弱分类器权重,其分类错误率越低,弱分类器权值越大,其权重就越高,就越有话语权。

 

七、adaboost和网格搜索配合调参

from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier

#Adaboost调参
#adaboost有自己的参数,他的base_estimator指向一个弱学习器,这个弱学习器也包含自己的参数
#为了使用GridSearchCV我们需要使用嵌套参数。在sklearn中我们使用双下划线表示"__"
param_grid = {"base_estimator__criterion": ["gini", "entropy"],
              "base_estimator__splitter": ["best", "random"],
              "base_estimator__max_depth": range(1,5),
              "n_estimators": [10,30,50,70,90,100]}
dtc = DecisionTreeClassifier()
ada = AdaBoostClassifier(base_estimator=dtc)
grid_search = GridSearchCV( ada, param_grid=param_grid, cv=10, scoring='accuracy' )
grid_search.fit( X_train,y_train )
print( 'Best params in Adaboost:', grid_search.best_params_, grid_search.best_score_ )

#利用Adaboost预测拆分的test
ada = AdaBoostClassifier( DecisionTreeClassifier( criterion=grid_search.best_params_['base_estimator__criterion'],
                                                  splitter=grid_search.best_params_['base_estimator__splitter'],
                                                  max_depth=grid_search.best_params_['base_estimator__max_depth'] ),
                         n_estimators=grid_search.best_params_['n_estimators'], random_state=0 )
method_Ada = Train.train( X_train, y_train, ada )
y_test_predict = Train.predict( X_test, method_Ada )
print( 'The Adaboost result in test: %.4g' % accuracy_score( y_test, y_test_predict) )
print( '使用Adaboost进行分类的报告结果:' )
print( classification_report(y_test, y_test_predict) )

 

转载于:https://www.cnblogs.com/always-fight/p/8921825.html

  • 1
    点赞
  • 5
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值