AdaBoost算法理解
AdaBoost的前身和今世
强可学习和弱可学习
- 在概率近似正确(PAC)学习框架中, 一个类如果存在:
- 一个多项式复杂度的学习算法,正确率略大于随机猜测(例如二分类问题中大于1/2),称弱可学习的
- 一个多项式复杂度的学习算法,并且正确率很高,称强可学习的
- Kearns和Valiant证明了强可学习和弱可学习是等价的
The Strength of Weak Learnability - Adaboost算法就是将弱学习器组成强学习器的算法
Explaining AdaBoost - 算法受到工业界和学术界的关注,充分的理论研究(统计学习方法证明)
AdaBoost算法是为了证明弱可学习和强可学习算法等价而提出的,随后,人们发现该类集成算法能够有效的提升一个学习器的作用,基于AdaBoost演化出了诸多的算法,例如在各大数据挖掘上大放光彩的XGBoost,几乎霸占了诸多数据竞赛榜单的前几多年(从2017开始),在数据预处理上填充空值常用的随机森林算法等等。
随后,学术界纷纷把关注点投向了这个算法的理论证明。得到了该类算法的统计学派角度的证明,即为AdaBoost是在指数损失函数、模型是加性模型、算法是前向分布算法。进一步的,给出了学习算法的训练误差界,说明了其训练过程中的最坏情况,并且表明其训练误差是以指数级别下降的。在明白了AdaBoost的统计意义后,人们尝试把损失函数换成其他的函数,使得演化为梯度提升算法,把分类器换为决策树,得到提升树算法…提升的思想和其他算法的结合演化了诸多运用性极强的算法。
以AdaBoost演变而来的Boost算法使得单个学习器的泛化指标得到或多或少的改进,在实际运用中,一个数据集合可能有多个合适的算法,但是相比寻找其他算法的合适参数,集成学习方法能够快速、高效的在数据上表现有泛化性能和学习性能,诸多数据分析师尤其是在数据挖掘领域的首选算法也是集成学习方法。
2017年KDD cup 1st model
算法与细节
算法
AdaBoost算法:
实现细节
那么进一步的,实际AdaBoost在迭代过程是一个线性地更新各个弱分类器的“决定权”的过程。一开始模型的权重系数为相同的均匀分布,使得学习器对于各个样本的关注是平等的,但在权重更新函数的影响下,在前面一次中分类较差的那些样本对于当前模型的加性系数影响就越大。
实现细节总结
注意到每次迭代测试集中的样本都具有不同的权重, 实现方法有:
- 在每个弱分类器计算损失函数的时候, 对相应样本的loss乘以权重缺点: 需要修改弱分类器, 在loss中引入权重
- 不需要修改弱分类器的方案: 直接修改训练集每次迭代都使用 Di 作为概率分布从原始数据集中生成新的数据集进行训练
算法实践和演示
数据集合
diabetes dataset
令人惊讶的该数据还未发生过拟合,单纯的增加弱学习器集成个数(加大迭代次数)并不容易使得其在数据上过拟合,原因也可能是数据测试集合过小。
之后,为了探究模型的最佳参数,尝试修改超参数,多次调参后,发现在该数据集合上学习率0.01、单个弱学习器迭代次数1200次较为合适。而考虑到模型稳定性和时间花费,集成25个弱学习器较为合适。
模型评价
- 首先对于AdaBoost为什么能够提升测试集上的泛化效果?
对于这个问题,大量翻阅资料后发现,提升算法AdaBoost因为集成了多个弱分类器,而前文讨论过,对于弱分类器来说,其表现为低方差和高偏差。但是精确度仍然欠缺,表现为图中第二个。而在提升方法AdaBoost中使用的是多个弱学习器的线性集成,即使在单个弱分类器上仍然表现为高偏差、低方差。
但是若把多个弱分类器按线性集成,则每次迭代集成一个弱分类器时,就表现为总体向真实分布更新步进,但是前提是各个分类器拥有不同的方差,并且在各个样本上的表现不同,可视化为以下:
其中每一部分红点代表一个弱分类器,弱分类器在方差上表现很好,但是在偏差上欠妥,而集成(本文中为加权投票)使得他们的方差不怎么改变的情况下,均值减少,这样就使得整个集成后的模型呈低偏差和低方差。那么,对于训练过程,每一次训练都是产生一个不同的偏差,但是方差差不多小的弱分类器,每一次集成使得其方差不怎么改变的情况下,偏差向真实样本(图片中心)逼近。这样就从偏差-方差的角度理解了集成学习中的Boost算法对于提升的影响
数据分布权重是如何影响模型的集成的?
前文探讨过,所谓权重的含义是指模型对于不同数据集合之间的“关注度”,但是这个描述是有偏差的,在原始的AdaBoost算法中,权重并不会影响弱分类器的参数,而只是决定弱分类器的决定权的重要程度,使得弱分类器在权重大的样本上错误的代价更大(获得较低的线性权值)。而现代的AdaBoost为了使得每一次加入弱分类器时都使得其与之前的弱分类器的表现不一致,加入了关于权重的对于个体样本学习关注度的机制,例如,一个样本的权重大并且学习器在该样本上分类错误,则按其权重加以惩罚。而大部分书籍都没有提及到这个细节,原始的AdaBoost中权重并不会影响参数,只能靠影响错误率和线性加和系数来产生影响。现代的AdaBoost为了使得权重分布能够更加多样(接下来会讨论多样性)在学习器中集成了对不同样本的权重惩罚,使得在前者的基础上改进。举例子说:第一个弱分类器在前几条数据上的表现好,但是后几条表现极差,而在下一个弱分类器产生时,就在之前的基础上产生一个新的对于某几条数据的关注(优先学习后几条数据,而减少对前面数据的关注)。如何达成一个好的集成模型?
对于集成学习,上文已经讨论过其基本要求是弱学习器的要比随机猜测效果要好,也就是起码要学习到东西。但是并不是只要是弱学习器就一定能达成好的集成,前提是弱学习器不能太差,如果弱学习器都十分差劲,那么在集成时偏差缩小的范围就相比来说十分巨大,即集成效果不会很好。所以得到第一点:集成的学习器不能效果太差。
而在上个问题中,多个学习器是通过加权投票的方式向真实的偏差分布步进,进一步的考虑,若多个分类器在不同的样本上的表现不同,那么他们的分布就应该是围绕着真实分布中心周围的数据,加权之后就可以逼近真实的偏差中心。而如果是各个弱分类器对各个数据的分类效果都差不多,那么,其加权后的偏差值应该是相似的,因此集成效果也不会很好,表现为下图:
那么这样就得到了第二点:各个学习器之间要各不相同(对各个数据的表现不一致)。
算法总结和反思
总结:
AdaBoost是第一种集成学习算法,其名前部分Ada意味Adaptive自适应的,即表示其可以自动调整对数据的关注(通过调整加性系数),后者Boost意味着提升,即算法可以从弱学习器提升到强学习器。
以它为根的,演变出了提升树、梯度提升、XGBoost算法等线性的提升算法簇,它们之间的差别仅仅是弱分类器不同、数据权重分布更新机制不同、判定弱学习器在数据上的表现的方式不同。使用几个简单的弱学习器集成到一起,就可以做十分复杂的事情,学习到复杂的特征表示。而最为重要的是,算法具有以下优点:
- 泛化性能好,精确度高
- 有统计学派充足的理论证明(前向分布算法的证明),解释性强
- 相比其他学习能力强的模型不容易过拟合
- 实践上性能足够好,受工业界和学术界的欢迎
- 一个数据集若有多个算法可以达到较好的解,则相比之下集成学习比较容易达到较好(不需要过多特征选择、不需要过多参数调节)
- 实现足够简单
那么,AdaBoost还有些什么缺点呢?
- 对缺失数据敏感。本次实验中未涉及该部分实践,但是可以容易想到的,若某个数据有缺失,那么一般某几个在该数据上的表现会过差或过好,从而使得对于该类数据的关注度产生偏差,并且随着迭代次数的增加,有可能使得其只关注这部分数据。
- 计算量大。每次迭代都是在训练一个弱分类器,相比于其他机器学习模型, AdaBoost运算量还是过大了。
- 如何选择弱学习器是问题。对于不同的分类器组合可能会得到更好的性能,如何选择有效的弱学习器没有固定的回答,需要针对数据讨论。
启发与思考
而其中最值得一提的就是提升运用于人脸识别,在最初没有卷积神经网络来提取特征的年代,人们几乎想不到一种很好能够实时的人脸识别算法(限于算力和算法的时间复杂度),但是提升思想提出后,有人尝试使用8个特征块的分类器来做人脸特征提取,这些单个特征块的精确度来说作用十分有限,仅仅只有比随机猜测好。例如使用一个中间是白色的两边是白色的掩膜做为特征特取,判定当前的被遮住的物体块是鼻梁部分的可能性,这样只是获得了极少了信息,是完全不足以进行人脸检测的(单个特征块识别率过低)。但是通过集成多个块,就可以有效的提升(提升方法),通过实验,发现使用8个特征掩膜块进行集成就可以得到极好的效果实现了实时的人脸检测,这种算法在计算机视觉的运用,使得实时检测人脸成为可能。
AdaBoost算法理解相关推荐
- Adaboost算法的理解
基本原理 Adaboost算法基本原理就是将多个弱分类器(弱分类器一般选用单层决策树)进行合理的结合,使其成为一个强分类器. Adaboost采用迭代的思想,每次迭代只训练一个弱分类器,训练好的 ...
- 理解AdaBoost算法
其它机器学习.深度学习算法的全面系统讲解可以阅读<机器学习-原理.算法与应用>,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造. 书的购买链接 书的勘误,优化,源代码资源 与随机森 ...
- 深入理解机器学习——集成学习(二):提升法Boosting与Adaboost算法
分类目录:<深入理解机器学习>总目录 Boosting是一族可将弱学习器提升为强学习器的算法.这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进 ...
- 基于Adaboost算法的人脸检测分类器!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:陈锴,Datawhale优秀学习者,中山大学数学系 人脸检测属于计 ...
- Adaboost 算法的原理与推导
Adaboost 算法的原理与推导 0 引言 一直想写Adaboost来着,但迟迟未能动笔.其算法思想虽然简单:听取多人意见,最后综合决策,但一般书上对其算法的流程描述实在是过于晦涩.昨日11月1日下 ...
- 机器学习知识点(十六)集成学习AdaBoost算法Java实现
理解http://blog.csdn.net/fjssharpsword/article/details/61913092中AdaBoost算法,从网上找了一套简单的代码加以理解. 1.基分类器,实现 ...
- EL之AdaBoost:集成学习之AdaBoost算法的简介、应用、经典案例之详细攻略
EL之AdaBoost:集成学习之AdaBoost算法的简介.应用.经典案例之详细攻略 目录 AdaBoost算法的简介 1.理解AdaBoost算法 1.1.从前向逐步递增角度来看理解AdaBoos ...
- eclipse的jsp第一行代码报错_机器学习之AdaBoost算法及纯python代码手工实现
Adaboost算法是boost算法中最具代表性的一个,它是adaptive boosting的简称(自使用算法);在训练数据中的每个样本赋予一个权重,构成初始的向量D(每个样本的权重初始时均相等). ...
- 【白话机器学习】算法理论+实战之AdaBoost算法
1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Ad ...
最新文章
- ITSM四大管理工具的比较
- 互联网时代,发展物联网是一场机遇与挑战并存的改革
- linux shell sshpass 远程服务器 批量修改密码
- 图像算法处理视频不稳定?港科大团队提出一种通用算法解决视频处理时域不稳定问题
- hive脚本执行方式
- jmeter数据库负载测试_JMeter:负载测试关系数据库
- POJ 3172 (认真读题的题)
- 【方便自己使用】KKT条件
- java se拖动插件_JQuery之拖拽插件
- 数论基础——扩展欧几里德算法解析
- 【学习笔记 31】 buu [0CTF 2016]piapiapia
- java最小因子_一个整数的所有最小因子
- 华为手机计算机怎么语音算术,只动口不动手!华为手机这个自带功能绝了,录音秒变文字!...
- 华硕B250M+I5-7500黑苹果EFI引导文件
- 随笔——基尔霍夫热辐射定律中灰体发射率和吸收率相等的推导逻辑
- (3)JavaScript基本概念
- 2020年 ICLR 国际会议最终接受论文(poster-paper)列表(四)
- html可以用搜狗浏览器打开网页,win8使用搜狗浏览器打开网页“显示WEB浏览器已对此页面进行了修改以帮助跨站脚本”怎么办...
- 分母是一元二次三项多项式,分子是一元一次二项的类型积分
- PHP做大转盘抽奖的思路,jQuery+PHP实现微信转盘抽奖功能的方法
热门文章
- 【软件架构】4+2 Layered Architecture 4+2分层架构:软件架构中的关注点分离
- Matlab高光谱遥感、数据处理与混合像元分解
- 苹果手机主题商店在哪_师出同门 苹果的LiDAR比安卓手机的Tof镜头好在哪
- Java中equal和==的区别
- MoveWindow与SetWindowPos的异同
- 巧妙防治网上病毒侵害的方法步骤
- android无法播放视频文件格式,基于Android引入IjkPlayer无法播放mkv格式视频的解决方法...
- 抖音涨粉变现最快的账号的一致性和美观性设计-阿甘电商
- Sol和IK分词器得基本使用
- PPT文本框设置实用技巧分享