机器学习算法-Adaboost

来源:互联网 发布:cxax2013车床软件 编辑:程序博客网 时间:2024/06/06 02:10

Boosting是一类算法的统称,其基本思想很简单,就是”三个臭皮匠顶个诸葛亮”:针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。常见的分类算法,如kNN、线性分类器、决策树等,均可经过特殊约束构造弱分类器。

这里写图片描述

弱弱联合,变得更强!!!强在准确度上比较好理解,但是怎么提高效率就有点困惑了。因为本来只需训练单个强分类器便可以解决问题,现在却要多个弱分类器组合才能得到结果,计算次数和成本“明显”增加了。其实这块的优化是单个弱分类器的计算开销远远地低于单个强分类器,如判断一个新样本,单个强分类器可能需要对比十个属性才能得到分类结果,但每个弱分类器每次只需要对比一个属性,即使五个弱分类器组合,计算成本也远远小于单个强分类器。

对于Boosting算法,主要存在两个问题:

  1. 如何调整训练集,使得在训练集上训练的弱分类器得以进行?
  2. 如何将训练得到的各个弱分类器联合起来形成强分类器?

针对以上两个问题,1995年,Freund and Schapire改进了Boosting算法,取名为Adaboost算法。AdaBoost算法的调整主要是:

  1. 使用加权后选取的训练数据代替随机选取的训练样本,这样将训练的焦点集中在比较难分的训练数据样本上;   
  2. 将弱分类器联合起来,使用加权的投票机制代替平均投票机制。让分类效果好的弱分类器具有较大的权重,而分类效果差的分类器具有较小的权重。

一、Adaboost算法步骤

AdaBoost算法的具体步骤如下:

1.给定训练样本集S:(x1,y1),(x2,y2),......(xn,yn),其中xiXyiY={1,+1};T为训练的最大循环次数;

2.初始化样本权重为D1=1/n ,即为训练样本的初始概率分布;  
 
3.对于T轮训练,For t=1,2,……,T:
(1)基于当前训练样本的概率分布Dt,训练弱分类器ht;

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

ϵt=i=1NDt(xi)[ht(xiyi)];

(3)基于错误率,计算弱分类器ht的权重:
αt=12ln(1ϵtϵt);

(4)更新样本权重:
Dt+1(xi)=Dt(xi)Ztexp(αtyiht(xi)),
 
其中Zt=ni=1Dt(xi)exp(αtyiht(xi))为规范化因子,使的Dt+1满足概率分布;

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

H(x)=sign(t=1Tαtht(x)).

二、Adaboost算法举例

下面我们举一个简单的例子来看看Adaboost 的实现过程。 图中,“+”和“-”分别表示两种类别,在这个过程中,我们使用水平或者垂直的直线作为弱分类器,来进行分类:

这里写图片描述

第一步根据分类的正确率,得到一个新的样本分布D2,一个子分离器h1.其中画圈的样本表示被分错的。在右边图中,比较大的“+”表示对该样本做了加权。具体过程为算法最开始给了一个均匀的分布D1,所以每个点的值为0.1。当划分后,有三个点被划分错了,根据算法的误差表达式ϵ1=Pr[h1(xi)yi]得到误差为分错了的三个点的概率值之和,则ϵ1=0.1+0.1+0.1=0.3,而α1=0.42,然后增加分错点的权值。

这里写图片描述

基于新分布D2,得到一个新的一个子分类器h2及样本分布D3,。

这里写图片描述

再基于新的样本分布D3,得到一个子分类器h3

这里写图片描述

此时迭代结束,得到3个弱分类器。最终的强分类器由h1h2h3线性组合获得。

这里写图片描述

每个区域是属于哪个属性,由这个区域所在分类器的权值综合决定。比如左下角的区域,属于蓝色分类区的权重为h1 中的0.42和h2 中的0.65,其和为1.07;属于淡红色分类区域的权重为h3 中的0.92;属于淡红色分类区的权重小于属于蓝色分类区的权值,因此左下角属于蓝色分类区。因此可以得到整合的结果如上图所示,从结果图中看,即使是简单的分类器,组合起来也能获得很好的分类效果。

三、Adaboost权值调整的原因

注意到算法最后的表到式为

H(x)=sign(t=1Tαtht(x))

这里面的αt表示的权值,是由αt=12ln(1ϵtϵt)得到的。
关于误差的表达式,到这里就可以得到比较清晰的答案了,所有的一切都指向了误差。提高错误点的权值,当下一次分类器再次分错了这些点之后,会提高整体的错误率,这样就导致αt变的很小,最终导致这个分类器在整个混合分类器的权值变低。也就是说,这个算法让优秀的分类器占整体的权值更高,而挫的分类器权值更低。这个就很符合常理了。

四、Adaboost算法实战

# -*- coding: utf-8 -*-from sklearn.model_selection import cross_val_scorefrom sklearn.datasets import load_irisfrom sklearn.ensemble import AdaBoostClassifier#加载iris数据集irisdata = load_iris()#调用Adaboost模型,迭代次数为100numT = 100clf = AdaBoostClassifier(n_estimators=numT)#交叉验证scores = cross_val_score(clf, irisdata.data, irisdata.target)accres = scores.mean()print accres

注:AdaBoostClassifier函数介绍:http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html
cross_val_score函数介绍:http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.cross_val_score.html
正确率:
这里写图片描述

参考资料:

  1. http://blog.csdn.net/haidao2009/article/details/7514787 浅谈 Adaboost 算法
  2. http://www.cnblogs.com/pinard/p/6136914.html scikit-learn Adaboost类库使用小结
  3. http://blog.csdn.net/a1628864705/article/details/63309077 Scikit-Learn 集成方法(Ensemble method) 学习
  4. https://item.jd.com/10975302.html 《统计学习方法》 李航
  5. https://item.jd.com/11867803.html 《机器学习》 周志华
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手捻葫芦去皮后怎么办 苹果5s屏幕脱胶怎么办 夏天车内温度高怎么办 反复长粉刺痘痘怎么办 砂锅烫到手很痛怎么办 低压高怎么办吃什么好 熬夜多了掉头发怎么办 复蚕丝被洗过了怎么办 买了梅邦虫草精怎么办 医院不开转院证怎么办 棕垫一直有味道怎么办 棕子床垫味道大怎么办 羊绒大衣洗坏了怎么办 无痕内裤开胶了怎么办 衬衫洗了会缩水怎么办 脾虚引起的眼袋怎么办 沙漠玫瑰根烂了怎么办 多肉种子不发芽怎么办 多肉植物掉叶子怎么办 白色衣服染了蓝色怎么办 白色的衣服染色了怎么办 白毛衣染上金纺怎么办 白色的衣服变黄怎么办 白衣服84漂黄了怎么办 真丝的衣服皱了怎么办 衣服领子洗大了怎么办 真丝围巾洗皱了怎么办 真丝裙子洗花了怎么办 衣服晒得掉色了怎么办 衣服上出现霉点怎么办 校服后面的霉点怎么办 被子潮了有味道怎么办 涨奶堵塞有硬块怎么办 军训裤子腰大了怎么办 猫总是在床上尿怎么办 被子盖厚了上火怎么办 猫在被子上撒尿怎么办 脸上被辣椒辣了怎么办 压缩袋衣服皱了怎么办 新买的枕头太高怎么办 刚买的枕头太高怎么办