近期需要做一个TransferLearing的大作业,就先总结一下自己学习AdaBoost的一些思考
一直以来人们都想通过对分类器分错的样本构建单独的分类器来增加分类准确率,所以AdaBoost出现以前就有了boostrapping方法和bagging方法
AdaBoost历史:
1)bootstrapping方法的主要过程
主要步骤:
i)重复地从一个样本集合D中采样n个样本
ii)针对每次采样的子样本集,进行统计学习,获得假设Hi
iii)将若干个假设进行组合,形成最终的假设Hfinal
iv)将最终的假设用于具体的分类任务
2)bagging方法的主要过程 -----bagging可以有多种抽取方法
主要思路:
i)训练分类器
从整体样本集合中,抽样n* < N个样本 针对抽样的集合训练分类器Ci
ii)分类器进行投票,最终的结果是分类器投票的优胜结果
但是,上述这两种方法,都只是将分类器进行简单的组合,实际上,并没有发挥出分类器组合的威力来。直到1989年,Yoav Freund与 Robert Schapire提出了一种可行的将弱分类器组合为强分类器的方法。并由此而获得了2003年的哥德尔奖(Godel price)。
Schapire还提出了一种早期的boosting算法,其主要过程如下:
i)从样本整体集合D中,不放回的随机抽样n1 < n个样本,得到集合 D1
训练弱分类器C1
ii)从样本整体集合D中,抽取 n2 < n个样本,其中合并进一半被C1 分类错误的样本。得到样本集合D2
训练弱分类器C2
iii)抽取D样本集合中,C1 和 C2 分类不一致样本,组成D3
训练弱分类器C3
iv)用三个分类器做投票,得到最后分类结果
到了1995年,Freund and schapire提出了现在的adaboost算法,其主要框架可以描述为:
i)循环迭代多次
更新样本分布
寻找当前分布下的最优弱分类器
计算弱分类器误差率
ii)聚合多次训练的弱分类器
下面看一张几乎所有讲AdaBoost的书里面都会有的但是我感觉表述的不是特别好的一张AdaBoost算法流程图
接下来说说我对AdaBoost的理解
一、算法的精华
AdaBoost提供一个框架,其中的分类器可以自由选择,建立多少个这样的分类器由使用者自己选择。AdaBoost做的就是给每个分类器权重。权重计算方法就看这个分类器的分类准确率(跟样本权重有关)了。
AdaBoost每新建一个分类器就根据上一次的分类结果更新权重,将上一次分类正确的样本权重减小,然后根据这个分类器的对各个样本的分类结果,计算样本加权的准确率,然后根据样本加权的准确率给这个分类器赋权重,...
二、算法的有效性体现在哪儿?
AdaBoost在迭代的过程中,每一次都将分错的样本权重增加,并且AdaBoost模型中,每个样本的权重与分类器是不挂钩的,这里保证AdaBoost可以当作一个框架来使用,这里说偏了,因为我在学习的过程中有一段在这里特别迷糊,以为这里有什么高深的东西在里面呢?看明白后才感觉自己想得太多了。还是说说AdaBoost的样本权重更新策略吧。分类错的样本权重增加后,下一次又来了一个分类器,这时分类器训练一个模型后,可以计算分类准确率,这里的准确率是跟权重有关的,并且分类准确率直接影响到这个分类器在最后分类的权重。
这样,经过一轮迭代后,如果后面的分类器跟前面的分类结果差不多(前面和后面分对的样本差不多)的话,由于样本权重的关系,他的分类期权重肯定不会高,如果后面没前面分对的样本多,这样分类期样本权重更低了。由于前面分错的样本权重的增大,所以如果后面出现了把前面分错的样本分对的情况,这个分类器的分类准确率就会很大,分类器的权重就会特别高了。
当然,如果后面出现的分类器都没能把前面分错的分对的话,那AdaBoost也没办法了,毕竟人家只是一个框架。该是你分类器的事人家管不了。这一点在书中常见的二维直线分类的例子中不会出现,因为不管怎样,后面总会出现一个把前面分错的,分对的分类器,只要你设定的迭代次数足够大,极端的例子就是这个样本权重是1,只要这个样本分类正确了,我的这个分类器的权重就会特别大。但是这个问题在SVM,决策树等复杂的分类器中就没办法保证了(这也是我刚开始纠结的原因),所以这里跟你的分类器选择也有很大关系,这也算是提供框架的一个缺点了。
------------------
祝身体健康,万事如意
华电北风吹
天津大学计算机科学与技术学院认知计算与应用重点实验室
天津市卫津路92号
邮编: 30072
邮箱: [email protected]q.com