AdaBoost学习思考

近期需要做一个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中,不放回的随机抽样nn个样本,得到集合 D1

  训练弱分类器C1

  ii)从样本整体集合D中,抽取 nn个样本,其中合并进一半被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

时间: 2024-11-20 03:46:58

AdaBoost学习思考的相关文章

Adaboost学习总结

基本是网上的资料. 一.起源 boost 算法系列的起源来自于PAC Learnability(PAC 可学习性).这套理论主要研究的是什么时候一个问题是可被学习的,当然也会探讨针对可学习的问题的具体的学习算法.这套理论是由Valiant提出来的,也因此(还有其他贡献哈)他获得了2010年的图灵奖. PAC 定义了学习算法的强弱   弱学习算法---识别错误率小于1/2(即准确率仅比随机猜测略高的学习算法)   强学习算法---识别准确率很高并能在多项式时间内完成的学习算法 同时 ,Valian

2016041502 - 软件开发者如何学习思考

我一直思考软件行业如何高效学习快速有效掌握技能,那么我们可以学习有价值的技术,可以提高自己的收入! 原来学习方法,学习完三章回头复习一次,以此类推,这样大部分内容其实还可以记下来的.但这并不是一本技术学习终结,过段时间,你可能就会将原来学习的内容一干二净地忘记掉了! 根据学习金字塔理论,阅读听讲是被动学习方式,如果看完一本书,就结束,其实会忘记大部分内容.我猜测我们大部分人都是这么干的,其实阅读听讲完,我们需要实践实践再实践,我们要讨论,我们要写博客整理思路.这样才能将实践和理论结合上,加深我们

linux下的 lib文件的学习思考

说到这个LIB文件,先从一个小故障说起. 某日开发说,一台测试用虚机可以PING通SSH不能连了.运维同学就赶紧去查,SSHD_CONFIG配置文件都正确啊,一点错误都没有,那为什么呢? 测试下,不管连自己还是其他机,都是报错 这里注意看,提示你有个libcom_err.so.2共享库文件找不到. 询问开发,才了解他们测试一个软件,意外删除了某个库文件. 那么在正常的相同虚机的机器查看下,再和出错的虚机比对下,发现少了2个库文件 挂载系统光盘或从正常的虚机上把这个两个文件拷贝过来,放到lib64

[学习-思考-探究]莫队算法 曼哈顿最小生成树与分块区间询问算法-4

若要转载,不需要联系我,只需要在下面回复一下并注明原文. 在线区间询问算法(奇妙算法) 这是最神奇的算法,不仅简单还可以实现在线询问+修改. 考虑基础算法中的优化. 如果我们把整个区间分成$n^{\frac{1}{3}}$块,那么就可以记录任意两块之间的状态啦! 然后只要套用基础算法当中的操作就可以啦! 总空间复杂度和时间复杂度都是$O(n^{\frac{3}{4}})$,还是相当好的. 下面是例题: https://loj.ac/problem/6219 小Y的房间 标程就不放出来啦. 如有不

Qt学习思考

对各个部件基本了解,初步理解GUI应用程序的创建 2D图形文字绘制,3D图形(openGL)等 模型/视图框架编程,处理复杂的数据 多媒体框架 数据库,xml,文件读写等 网络编程 做出比较美观的界面就需要Html/CSS配合,也qss 尤其是Ps功底!

tp5学习思考

路由 tp5不再支持普通路由的访问,如果在route.php配置文件中,添加路由规则 Route::rule('nihao/[:name]','nihao'); index控制器nihao方法如下 public function nihao(Request $request,$name = 'World') { echo 'url:'.$request->url().'<br/>'; return 'hello '.$name; } 通过http://www.tp52.com/nihao

不要学习代码,要学会思考(转)

英文原文:Don't learn to code, learn to think 译/赖信涛 这是一个人人都在学习编程的时代:Code.org请了比尔·盖茨,马克·扎克伯格和克里斯·波什等这些名人,来告诉你,每个人都可以编程:CoderDojo’s在各个国家悄然兴起:在英国,编程已经是各个年级学生的正式课程. 我认为这里有个误区.别误会我——如果每个人都会一些编程知识,这个世界当然会变得更好——但是学会写代码不应该是我们的目标.计算机和程序只是一个工具,是一种达到某种目的的方法. 真正的目标应该

不仅学习代码,也要学会思考

这是一个人人都在学习编程的时代: [合肥开源IT教育][开源培训][php培训][开源教育][开源IT教育培训][合肥php培训]Code.org请了比尔·盖茨,马克·扎克伯格和克里斯·波什等这些名人,来告诉你,每个人都可以编程:CoderDojo’s在各个国家悄然兴起:在英国,编程已经是各个年级学生的正式课程.我认为这里有个误区.别误会我——如果每个人都会一些编程知识,这个世界当然会变得更好——但是学会写代码不应该是我们的目标.计算机和程序只是一个工具,是一种达到某种目的的方法.真正的目标应该

不要学习代码,要学会思考《IT蓝豹》

这是一个人人都在学习编程的时代:Code.org请了比尔·盖茨,马克·扎克伯格和克里斯·波什等这些名人,来告诉你,每个人都可以编程:CoderDojo's在各个国家悄然兴起:在英国,编 程已经是各个年级学生的正式课程. 我认为这里有个误区.别误会我--如果每个人都会一些编程知识,这个世界当然会变得更好--但是学会写代码不应该是我们的目标.计算机和程序只是一个工具,是一种达到某种目的的 方法. 真正的目标应该是学会思考的方式.换句话说,我们应该尝试教授计算机科学,而不是教着写代码.在本文中,我将介