AdaBoost算法理解

时光总嘲笑我的痴心妄想 提交于 2020-01-25 17:51:33

AdaBoost的前身和今世

强可学习和弱可学习

  1. 在概率近似正确(PAC)学习框架中, 一个类如果存在:
    • 一个多项式复杂度的学习算法,正确率略大于随机猜测(例如二分类问题中大于1/2),称弱可学习的
    • 一个多项式复杂度的学习算法,并且正确率很高,称强可学习的
  2. Kearns和Valiant证明了强可学习和弱可学习是等价
    The Strength of Weak Learnability
  3. Adaboost算法就是将弱学习器组成强学习器的算法
    Explaining AdaBoost
  4. 算法受到工业界和学术界的关注,充分的理论研究(统计学习方法证明)

AdaBoost算法是为了证明弱可学习和强可学习算法等价而提出的,随后,人们发现该类集成算法能够有效的提升一个学习器的作用,基于AdaBoost演化出了诸多的算法,例如在各大数据挖掘上大放光彩的XGBoost,几乎霸占了诸多数据竞赛榜单的前几多年(从2017开始),在数据预处理上填充空值常用的随机森林算法等等。
3
随后,学术界纷纷把关注点投向了这个算法的理论证明。得到了该类算法的统计学派角度的证明,即为AdaBoost是在指数损失函数、模型是加性模型、算法是前向分布算法。进一步的,给出了学习算法的训练误差界,说明了其训练过程中的最坏情况,并且表明其训练误差是以指数级别下降的。在明白了AdaBoost的统计意义后,人们尝试把损失函数换成其他的函数,使得演化为梯度提升算法,把分类器换为决策树,得到提升树算法…提升的思想和其他算法的结合演化了诸多运用性极强的算法。
以AdaBoost演变而来的Boost算法使得单个学习器的泛化指标得到或多或少的改进,在实际运用中,一个数据集合可能有多个合适的算法,但是相比寻找其他算法的合适参数,集成学习方法能够快速、高效的在数据上表现有泛化性能和学习性能,诸多数据分析师尤其是在数据挖掘领域的首选算法也是集成学习方法。

1
2017年KDD cup 1st model

算法与细节

算法

6

AdaBoost算法:

4

2
7

实现细节

8
9
10

那么进一步的,实际AdaBoost在迭代过程是一个线性地更新各个弱分类器的“决定权”的过程。一开始模型的权重系数为相同的均匀分布,使得学习器对于各个样本的关注是平等的,但在权重更新函数的影响下,在前面一次中分类较差的那些样本对于当前模型的加性系数影响就越大。
实现细节总结
注意到每次迭代测试集中的样本都具有不同的权重, 实现方法有:

  • 在每个弱分类器计算损失函数的时候, 对相应样本的loss乘以权重缺点: 需要修改弱分类器, 在loss中引入权重
  • 不需要修改弱分类器的方案: 直接修改训练集每次迭代都使用 Di 作为概率分布从原始数据集中生成新的数据集进行训练

算法实践和演示

数据集合

diabetes dataset

13
12
11
令人惊讶的该数据还未发生过拟合,单纯的增加弱学习器集成个数(加大迭代次数)并不容易使得其在数据上过拟合,原因也可能是数据测试集合过小。
之后,为了探究模型的最佳参数,尝试修改超参数,多次调参后,发现在该数据集合上学习率0.01、单个弱学习器迭代次数1200次较为合适。而考虑到模型稳定性和时间花费,集成25个弱学习器较为合适。

模型评价

  1. 首先对于AdaBoost为什么能够提升测试集上的泛化效果?
    对于这个问题,大量翻阅资料后发现,提升算法AdaBoost因为集成了多个弱分类器,而前文讨论过,对于弱分类器来说,其表现为低方差和高偏差。但是精确度仍然欠缺,表现为图中第二个。而在提升方法AdaBoost中使用的是多个弱学习器的线性集成,即使在单个弱分类器上仍然表现为高偏差、低方差。

14
但是若把多个弱分类器按线性集成,则每次迭代集成一个弱分类器时,就表现为总体向真实分布更新步进,但是前提是各个分类器拥有不同的方差,并且在各个样本上的表现不同,可视化为以下:
15
其中每一部分红点代表一个弱分类器,弱分类器在方差上表现很好,但是在偏差上欠妥,而集成(本文中为加权投票)使得他们的方差不怎么改变的情况下,均值减少,这样就使得整个集成后的模型呈低偏差和低方差。那么,对于训练过程,每一次训练都是产生一个不同的偏差,但是方差差不多小的弱分类器,每一次集成使得其方差不怎么改变的情况下,偏差向真实样本(图片中心)逼近。这样就从偏差-方差的角度理解了集成学习中的Boost算法对于提升的影响

  1. 数据分布权重是如何影响模型的集成的?
    前文探讨过,所谓权重的含义是指模型对于不同数据集合之间的“关注度”,但是这个描述是有偏差的,在原始的AdaBoost算法中,权重并不会影响弱分类器的参数,而只是决定弱分类器的决定权的重要程度,使得弱分类器在权重大的样本上错误的代价更大(获得较低的线性权值)。而现代的AdaBoost为了使得每一次加入弱分类器时都使得其与之前的弱分类器的表现不一致,加入了关于权重的对于个体样本学习关注度的机制,例如,一个样本的权重大并且学习器在该样本上分类错误,则按其权重加以惩罚。而大部分书籍都没有提及到这个细节,原始的AdaBoost中权重并不会影响参数,只能靠影响错误率和线性加和系数来产生影响。现代的AdaBoost为了使得权重分布能够更加多样(接下来会讨论多样性)在学习器中集成了对不同样本的权重惩罚,使得在前者的基础上改进。举例子说:第一个弱分类器在前几条数据上的表现好,但是后几条表现极差,而在下一个弱分类器产生时,就在之前的基础上产生一个新的对于某几条数据的关注(优先学习后几条数据,而减少对前面数据的关注)。

  2. 如何达成一个好的集成模型?
    对于集成学习,上文已经讨论过其基本要求是弱学习器的要比随机猜测效果要好,也就是起码要学习到东西。但是并不是只要是弱学习器就一定能达成好的集成,前提是弱学习器不能太差,如果弱学习器都十分差劲,那么在集成时偏差缩小的范围就相比来说十分巨大,即集成效果不会很好。所以得到第一点:集成的学习器不能效果太差。
    而在上个问题中,多个学习器是通过加权投票的方式向真实的偏差分布步进,进一步的考虑,若多个分类器在不同的样本上的表现不同,那么他们的分布就应该是围绕着真实分布中心周围的数据,加权之后就可以逼近真实的偏差中心。而如果是各个弱分类器对各个数据的分类效果都差不多,那么,其加权后的偏差值应该是相似的,因此集成效果也不会很好,表现为下图:
    16
    那么这样就得到了第二点:各个学习器之间要各不相同(对各个数据的表现不一致)。

算法总结和反思

总结:
AdaBoost是第一种集成学习算法,其名前部分Ada意味Adaptive自适应的,即表示其可以自动调整对数据的关注(通过调整加性系数),后者Boost意味着提升,即算法可以从弱学习器提升到强学习器。
以它为根的,演变出了提升树、梯度提升、XGBoost算法等线性的提升算法簇,它们之间的差别仅仅是弱分类器不同、数据权重分布更新机制不同、判定弱学习器在数据上的表现的方式不同。使用几个简单的弱学习器集成到一起,就可以做十分复杂的事情,学习到复杂的特征表示。而最为重要的是,算法具有以下优点:

  • 泛化性能好,精确度高
  • 有统计学派充足的理论证明(前向分布算法的证明),解释性强
  • 相比其他学习能力强的模型不容易过拟合
  • 实践上性能足够好,受工业界和学术界的欢迎
  • 一个数据集若有多个算法可以达到较好的解,则相比之下集成学习比较容易达到较好(不需要过多特征选择、不需要过多参数调节)
  • 实现足够简单

那么,AdaBoost还有些什么缺点呢?

  • 对缺失数据敏感。本次实验中未涉及该部分实践,但是可以容易想到的,若某个数据有缺失,那么一般某几个在该数据上的表现会过差或过好,从而使得对于该类数据的关注度产生偏差,并且随着迭代次数的增加,有可能使得其只关注这部分数据。
  • 计算量大。每次迭代都是在训练一个弱分类器,相比于其他机器学习模型, AdaBoost运算量还是过大了。
  • 如何选择弱学习器是问题。对于不同的分类器组合可能会得到更好的性能,如何选择有效的弱学习器没有固定的回答,需要针对数据讨论。

启发与思考

而其中最值得一提的就是提升运用于人脸识别,在最初没有卷积神经网络来提取特征的年代,人们几乎想不到一种很好能够实时的人脸识别算法(限于算力和算法的时间复杂度),但是提升思想提出后,有人尝试使用8个特征块的分类器来做人脸特征提取,这些单个特征块的精确度来说作用十分有限,仅仅只有比随机猜测好。例如使用一个中间是白色的两边是白色的掩膜做为特征特取,判定当前的被遮住的物体块是鼻梁部分的可能性,这样只是获得了极少了信息,是完全不足以进行人脸检测的(单个特征块识别率过低)。但是通过集成多个块,就可以有效的提升(提升方法),通过实验,发现使用8个特征掩膜块进行集成就可以得到极好的效果实现了实时的人脸检测,这种算法在计算机视觉的运用,使得实时检测人脸成为可能。
5

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!