分类算法——Adaboost

分类算法——Adaboost

 

1       Adaboost算法

Adaboost算法是由boosting算法发展而来的。那么先讲讲boosting算法原理。

Boosting是一个算法框架,通过组合其他机器学习算法来构造一个强分类器。它主要是通过对样本集的操作获得样本子集 ,用该样本子集去训练生成基分类器;每得到一个样本集就用该基分类算法在该样本集上产生一个基分类器,这样在给定训练轮数 n ,就可产生 n 个基分类器,然后Boosting框架算法将这 n个基分类器进行加权融合,产生一个最后的结果分类器,在这 n个基分类器中,每个单个的分类器的识别率不一定很高,但他们联合后的结果有很高的识别率,这样便提高了该弱分类算法的识别率。在产生单个的基分类器时可用相同的分类算法,也可用不同的分类算法。

这样看来Boosting算法似乎已经很好了,那为什么还要有一个Adaboost算法干啥?

实际上Boosting算法在解决实际问题时有一个重大的缺陷,即它需要事先知道弱分类算法分类正确率的下限,这在实际问题中很难做到。所以在后来的研究中Freund Schapire提出了 AdaBoost 算法,该算法的效率和Boosting算法的效率几乎一样,却可以非常容易地应用到实际问题中。现在来看看Adaboost算法框架(wikipedia)

分类算法——Adaboost - zengkui111 - 北斗之首——魁
 

对于这个算法需要介绍的是:

1.         算法开始前,需要将每个样本的权重初始化为1/m,这样一开始每个样本都是等概率的分布,每个分类器都会公正对待。

2.         开始迭代后,需要计算每个弱分类器的分类错误的误差,误差等于各个分错样本的权重和,这里就体现了样本权重的作用。如果一个分类器正确分类了一个权重大的样本,那么这个分类器的误差就会小,否则就会大。这样就对分类错误的样本更大的关注。

3.         获取最优分类器后,需要计算这个分类器的权重,然后再更新各个样本的权重,然后再归一化

4.         算法迭代的次数一般不超过弱分类器的个数,如果弱分类器的个数非常之多,那么可以权衡自己性价比来折中选择。

5.         迭代完成后,最后的分类器是由迭代过程中选择的弱分类器线性加权得到的。

 

2       实例解析

下面例举一个简单的例子来说明算法的运行过程。如下图在二维平面上分布了如下两种颜色的点,不同颜色的点代表了不同类别的数据,一般来讲用线性分类器是不可分的,因为没有明显的分界线,但是现在需要用adaboost算法将他们分开。

分类算法——Adaboost - zengkui111 - 北斗之首——魁
 

         adaboost算法进行分类,那么首先需要定义的就是弱分类器,如下图,我们可以定义如下图虚线所示的弱分类器。

分类算法——Adaboost - zengkui111 - 北斗之首——魁

 

        初始化各个样本的权重后就可以开始迭代了,依照wiki上的算法框架下面给出了算法进行20次迭代后,选择的分类器的情况如下:

iteration 0 [ (-inf, 8.5) y ] -0.530435980343

iteration 1 [ (6.5, inf) x ] -0.405465108108

iteration 2 [ (-inf, 3.5) x ] -0.362281688397

iteration 3 [ (-inf, 8.5) y ] -0.50229166951

iteration 4 [ (7.5, inf) y ] -0.329115179032

iteration 5 [ (8.5, inf) y ] 0.245959304836

iteration 6 [ (4.5, inf) y ] 0.394479043549

iteration 7 [ (-inf, 8.5) y ] -0.279930813609

iteration 8 [ (3.5, inf) x ] 0.392890051159

iteration 9 [ (-inf, 6.5) x ] 0.282848009329

iteration 10 [ (8.5, inf) y ] 0.45910361684

iteration 11 [ (-inf, 7.5) y ] 0.316216082219

iteration 12 [ (-inf, 8.5) y ] -0.238788369567

iteration 13 [ (6.5, inf) x ] -0.342006845132

iteration 14 [ (8.5, inf) y ] 0.25296754864

iteration 15 [ (-inf, 4.5) y ] -0.36650324231

iteration 16 [ (-inf, 8.5) y ] -0.265860506761

iteration 17 [ (-inf, 3.5) x ] -0.416892893363

iteration 18 [ (-inf, 8.5) y ] -0.290721983964

iteration 19 [ (7.5, inf) y ] -0.322597760403

         将这二十个弱分类器线性组合起来得到的分类完全正确。当然这个完全正确是因为构造的数据的原因。但是从这个例子可以看出adaboost确实是一个非常不错的分类算法。

3       代码实现

https://github.com/zengkui/machine-learning/blob/master/Adaboost/adaboost.py

此代码就是针对上例给出的可执行的python代码

4       模型的优缺点

毫无疑问这个模型的最大的一个优点是可以自动的组合弱分类器,这在实际应用中的便利之处十分明显。 人类大脑很擅长于总结各种规律,从而制定规则来进行数据处理,但是当规则变多后,怎么组织这些规则在一起共同发挥作用,这时候人的大脑的局限性就非常明显了,而adaboost算法正好弥补了这一点。此外算法本身简单,高效,易于编写而且训练过程是没有参数需要调节的。

但是adaboost也是有确点的,并不是所有问题都能搞定,从wiki上介绍的来看,adaboost对于噪音数据和异常数据是十分敏感的。

                                              


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值