机器学习算法(2)——AdaBoost算法

Boosting算法
     提升算法/Boosting是一种提高弱分类器准确度的方法。

      通常在分类问题中,boosting通过改变训练样本的权重,学习多个分类器,并将这些分类器线性组合,提高分类性能。 一组弱分类器可以创建一个强大的分类器。 Boosting 就是通过组合许多弱分类器(只比随机选择好一点)来产生一个强大的分类器组。且弱分类器的设计简单没有太大计算量。 
boosting算法有很多,如AdaBoost,LPBoost,TotalBoost,BrownBoost,xgboost,MadaBoost,LogitBoost等等。大多数boosting算法都是改变训练数据的权值分布,针对不同的训练数据分布调用弱学习算法学习一系列弱分类器。因此,许多boosting算法之间的差异在于对训练样本和假设进行加权的方法不同。众多boosting算法中最具代表性的是AdaBoost算法。

AdaBoost算法

     Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。使用adaboost分类器可以排除一些不必要的训练数据特征,并放在关键的训练数据上面。AdaBoost算法中,对于训练样本的权值:每一轮都增大前一轮弱分类器误判的样本的权值,并减小正确分类的样本的权值。如下图所示:(图片来自百度百科) 

                                  

算法简介
      假设决定是否要做一件事情,并且想咨询朋友。首先你需要在自己的朋友圈中筛选咨询哪几位朋友。假设你最后选定了三位朋友,不幸的是他们提供的意见之间存在分歧,他们的意见分别是 支持(+1), 反对(-1),支持(+1)。为了能够有效的结合这三位朋友的意见,一个显然的想法是根据朋友的靠谱程度将每个朋友意见的分量考虑进来。假设三位朋友的分量分别是 0.5 0.7 0.4。加权后的得到朋友们总的意见为支持(0.5-0.7+0.4>0)
     Adaboosting 算法是将很多个分类器的的意见有效的结合起来,以达到更好的分类效果。算法需要做两件事情:1.从众多候选分类器中筛选出分类器。2.赋予被筛选出来的分类器说话的分量。首先来说筛选分类器的算法。假设已经筛选出m个分类器,从剩余的分类器中筛选出下一个分类器的原则是:该分类器误分类的加权成本(加权数为样本权值)在所有剩余分类器中最小。其次通过最小化总成本能够求的新添加分类器的权值。
     算法中有一个很重要的环节。每一个训练样本都被赋予权值,并且随着训练过程样本权值不断更新。更新的原则是:误分类样本被赋予更高的权值,而正确分类样本的权值被相应降低。通过这种方式能够将重点放在不能正确分类的样本上,新选出来的分类器能够发挥原有分类器没有的作用,提高整体的分类效果。

对于boosting算法,存在两个问题:

1. 如何调整训练集,使得在训练集上训练的弱分类器得以进行;

2. 如何将训练得到的各个弱分类器联合起来形成强分类器。

针对以上两个问题,adaBoost算法进行了调整:

1. 使加权后选取的训练数据代替随机选取的训练样本,这样将训练的焦点集中在比较难分的训练数据样本上;

2. 将弱分类器联合起来,使用加权的投票机制代替平均投票机制。让分类效果好的弱分类器具有较大的权重,而分类效果差的分类器具有较小的权重。

AdaBoost算法中不同的训练集是通过调整每个样本对应的权重来实现的。开始时,每个样本对应的权重是相同的,即其中 n 为样本个数,在此样本分布下训练出一弱分类器。对于分类错误的样本,加大其对应的权重;而对于分类正确的样本,降低其权重,这样分错的样本就被突显出来,从而得到一个新的样本分布。在新的样本分布下,再次对样本进行训练,得到弱分类器。依次类推,经过 T 次循环,得到 T 个弱分类器,把这 T 个弱分类器按一定的权重叠加(boost)起来,得到最终想要的强分类器。 AdaBoost算法的具体步骤如下:

1. 给定训练样本集S,其中X和Y分别对应于正例样本和负例样本; T为训练的最大循环次数;

2. 初始化样本权重为1/n ,即为训练样本的初始概率分布

3. 第一次迭代:

(1) 训练样本的概率分布相当下,训练弱分类器

(2) 计算弱分类器的错误率;

(3) 选取合适阈值,使得误差最小;

(4) 更新样本权重;

经T次循环后,得到T个弱分类器,按更新的权重叠加,最终得到的强分类器。

       Adaboost算法是经过调整的Boosting算法,其能够对弱学习得到的弱分类器的错误进行适应性调整。上述算法中迭代了T次的主循环,每一次循环根据当前的权重分布对样本x定一个分布P,然后对这个分布下的样本使用弱学习算法得到一个弱分类器。更新的规则是:减小弱分类器分类效果较好的数据的概率,增大弱分类器分类效果较差的数据的概率。最终的分类器是个对所有的弱分类器的加权平均

(有opencv实例代码)from:https://blog.csdn.net/akadiao/article/details/79423377

举一个粒子来说明Adaboost算法的运行过程:

            

给定下边的数据集D,我们用AdaBoost算法来学习得到一个强分类器:

x0123456789
y111-1-1-1111-1

数据集D共有10条数据,根据x的输入得到的y可以分类两类,即y=1与y=-1。我们每一轮使用最简单的决策树桩来构建基分类器,即每轮设定一个阈值θ,只要x<θ,就判定为正类(y=1),x>θ就判定为负类(y=-1)。

 第一轮:

D_{1}(x)

因为是第一轮,故所有样本的权重相同:

                               D_{1}(\vec{x})=(\frac{1}{10},\frac{1}{10},\frac{1}{10},\frac{1}{10},\frac{1}{10},\frac{1}{10},\frac{1}{10},\frac{1}{10},\frac{1}{10},\frac{1}{10})

θ:

因为是离散数据,所以θ可以依次取0.5,1.5,2.5,...,8.5来对x进行分类,这里可以有两种分类方法:

x<θ时分为正类,x>θ时分为负类,分类错误率对应\epsilon _{t}^{1}

x>θ时分为正类,x<θx时分为负类,分类错误率对应\epsilon _{t}^{2}

最终要选择一个令\epsilon _{t}取得最小值的θ与分类方法,这9个θ值在两种分类方法下,此层h1的错误率分别为:

                             

     (在这里说明一下向量里的元素是如何计算的,以\epsilon _{t}^{1}向量的第一个元素为例(0.5*1/10),它选取θ=0.5作为阈值,将10个样本的x值与θ=0.5比较,结果是,x=0样本<θ,归为正类1;其他9个元素全归为负类-1。将我们的分类结果与实际的y值比较发现,第x=1,2,6,7,8个样本分类错误,5个样本错误,所以错误率为0.5*1/10)

       可以看到为最小值。对应的,我们取θ为2.5(θ为8.5亦可),使用第一种分类方法。则x为0,1,2的样本分为正类,都分对了;而之后的样本都被分为负类,分错了3个,所以总错误率为0.3∗1/10。故此轮弱分类器的阈值θ取2.5,分类方法取第一种,对应的错误率用于后续求权重。

基分类器h_{1}:    h_{1}(x)=(1,1,1,-1,-1,-1,-1,-1,-1,-1)

第一层基分类器h_{1}的权重\alpha _{1},通过如下的公式来计算:

                         

H(x),P_{A}(D)

整个模型(现在只有一个基分类器)的准确率为:P_{A}(D)=0.7    (分错了3个)

至此第一轮的工作就结束了,可以看出被误分类样本的权值之和影响误差率,误差率影响基分类器在最终分类器中所占的权重。

第二轮D_{2}(x)

第一轮训练完成后对D_{1}(x)进行更新,得到D_{2}(x),更新公式通过下边的公式来计算更新:

                

D_{2}(x)=,(0.071,0.071,0.071,0.071,0.071,0.071,0.167,0.167,0.167,0.071,),上一轮中x=6、7、8的点分错了,可以看到这三个点在D_{2}(x)中的权重变大了,而其余分类正确的点权重变小了。

θ


    我们依然对θ依次取0.5, 1.5, ... , 8.5来对x进行分类,注意我们刚才已经得到了D_{2}(x),样本权重的分布不再是第一轮全部相等的1/10了,如当θ取0.5按第一种分类方法进行分类时,\epsilon _{2}^{1}计算方法如下:

                    

 对所有θ与分类方法都按照如上的步骤进行计算:

                 

可以看到0.214为最小值,故此轮弱分类器的阈值θ取8.5,分类方法为第一种。

  

至此第二轮的工作就结束了,下面我们继续使用上边的方式来看第三轮是否能将准确率提升。

第三轮:

 

至此,我们只用了3个弱(基)分类器就在样本集DD上得到了100%的准确率,总结一下:

总结

    在训练过程中,每个新的模型都会基于前一个模型的表现结果进行调整,这也就是为什么AdaBoost是自适应(adaptive)的原因,即AdaBoost可以自动适应每个基学习器的准确率。

from:http://www.cnblogs.com/willnote/p/6801496.html

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值