独家 | 一文读懂Adaboost

640?wx_fmt=png&wxfrom=5&wx_lazy=1


本文是数据派研究部“集成学习月”的第二篇文章,本月将陆续发布关于集中学习的话题内容,月末将有答题互动活动来赢奖,欢迎随时留言讨论相关话题。


引言


在正儿八经地介绍集成学习的内容之前,我们想先介绍一下Kaggle竞赛,这是我们要介绍集成学习的初衷之一。Kaggle(https://www.kaggle.com)是由安东尼·戈德布卢姆在2010年创办的一个数据建模和数据分析平台,其目标就是使数据科学成为一项运动 。这个平台对所有的注册用户开放,企业和研究者可以在上面发布自己的数据并描述自己的目标,感兴趣的数据分析专家可在上面进行竞赛来解决问题。


Kaggle竞赛包括Featured,Recruitment,Research,Playground,Getting started和In class几种类别,其中Featured,Recruitment,Research是企业或研究机构发布的,提供一定数额的奖金,问题比较难;Playground,Getting started则是提供给数据分析爱好者们一些入门级的练习,难度较低,对于新手建议从这两个类别入手;最后In class则是提供给教学用的,老师布置一些任务同班同学可以在上面完成,这个一般是私密的不是外界都能参与的。


Kaggle在数据分析领域非常有影响力,在全球范围内拥有将近20万名数据科学家,其竞赛领域包括计算机科学、统计学、经济学和数学。Kaggle的竞赛在艾滋病研究、棋牌评级和交通预测方面取得了成果并且基于这些成果产生了一系列的学术论文。


什么是集成学习


在很多Kaggle竞赛以及很多工程实践中,集成学习的策略由于其良好的预测性能而备受青睐。那么什么是集成学习?集成学习是一种机器学习框架,其主要思想就是将多个基础模型组合起来,提高整体模型的泛化能力。集成学习的思想背后有比较成熟的数学理论作支撑,也即Valiant和Kearns提出的PAC (Probably approximately correct) 学习框架下的强可学习和弱可学习理论。该理论指出:在PAC 的学习框架中,一个概念如果存在一个多项式的学习方法能够学习它,并且如果预测正确率很高,那么就称这个概念是强可学习的;如果正确率仅比随机猜测略好,那么就称这个概念是弱可学习的。随后,Schapire证明了强可学习和若可学习是等价的,也就是说弱学习模型是可以通过组合提升为强学习模型的,由此便形成了后来的集成学习的思想。


集成学习的思想其实是比较自然的,俗话说的“三个臭皮匠,顶个诸葛亮”,就是一种典型的集成学习的思想。那么集成学习的框架下具体包含哪些算法呢?根据南京大学周志华老师2009年发表的一篇关于集成学习的综述,集成学习的框架主要有三种:boosting,bagging以及stacking,其中boosting包含有Adaboost 和GBDT等,bagging的典型代表是Random Forest,stacking则是多种基础模型的结合,这三种方法思想大同小异,但是模型训练的过程不同,限于篇幅,本文主要介绍boosting学习框架中的Adaboost,在以后的系列文章中会再介绍其他方面有关集成学习的内容。


Boosting


Boosting是一种广泛应用的集成学习框架,该框架一般的训练过程是依次训练基础模型,并在训练过程中对训练集不断地进行调整,也即当前训练所用的训练集由前一次训练的训练集根据某些策略调整得到,最后将所有基础模型组合起来即为最终得到的模型。Boosting学习框架中最具代表性的算法就是Adaboost,因此,本文将通过Adaboost来深入学习boosting思想及其具体实现。


Adaboost算法


大家都知道Adaboost算法是一种应用非常广泛也非常有效的机器学习方法,也被评为数据挖掘领域十大经典算法之一。那么什么是Adaboost算法,一句话描述就是:在当前基础模型训练时,提高训练集中前一个基础模型误分类样本的权重,使得前面被误分类的样本获得更多的关注,从而提升当前基础模型。在机器学习中,Adaboost 是一种有监督的分类(classification)学习算法。


算法步骤:


独家 | 一文读懂Adaboost_第1张图片

独家 | 一文读懂Adaboost_第2张图片

独家 | 一文读懂Adaboost_第3张图片


关于以上步骤的几点说明:

 

  • 每轮训练中所有样本的权重之和为1:

    640?wx_fmt=png&wxfrom=5&wx_lazy=1

  • 基础模型可以是很简单的模型,例如简单的规则分类器:

    640?wx_fmt=png&wxfrom=5&wx_lazy=1

  • 从基础模型的权重系数的计算式上可以看出,分类错误率越大的模型系数值越小(注意这里的系数值可以是负数)。

  • 最后一步中基础模型的线性组合不需要再进行训练,这一点与stacking集成学习框架有所区别。


算法伪代码:


为了可以更加专业一点描述Adaboost算法,下面将2.1的步骤以伪代码的形式展现出来,便于后面的实现。


独家 | 一文读懂Adaboost_第4张图片


说明:


  • 第1行初始化样本权重,m表示样本总数。

  • 第2到11行表示的是每一轮训练过程,t表示当前训练的轮数,T表示总的训练轮数

  • 第4行计算训练误差

  • 第5行计算当前基础模型的组合系数

  • 第6到8行更新样本权重


Adaboost实例实现


知道了Adaboost算法的执行过程,我们先来找个实际的例子来实现一下,毕竟在实践中学习更有利于我们对算法的理解。为了清楚的展示Adaboost的计算过程,我们利用李航老师《统计学习方法》中的例8.1的数据来实现,也方便大家与书上作比较。

 

首先,在python里载入一些必须的packages:


独家 | 一文读懂Adaboost_第5张图片

 

定义基础模型:其中,data就是输入的训练数据,Dt则是第t个基础模型对应的训练样本的权重。这里定义的基础模型非常简单,即找到一个阈值,以该阈值为分类边界进行分类。


独家 | 一文读懂Adaboost_第6张图片


Adaboost样本权值修正,提升基础模型:


独家 | 一文读懂Adaboost_第7张图片


组合T个基础模型,构建最终的模型并进行预测:


独家 | 一文读懂Adaboost_第8张图片


最后,运行一下模型:


独家 | 一文读懂Adaboost_第9张图片


输出的结果:数据分布,3个基础模型,最终的准确率


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

独家 | 一文读懂Adaboost_第10张图片


对于Adaboost的实现,笔者有两个建议:


  • 基础模型的类型决定了boosting的方式,基础模型如果直接依赖于分类错误率则可以直接对样本进行重赋权值,如果模型不依赖分类错误率则考虑按样本分布进行抽样。

  • 目前已经有很多非常成熟的开源packages可以直接应用(例如sklearn的AdaboostClassifier),所以能避免重复造轮子就尽量避免。


Adaboost算法推导


对于一些简单的实际应用,知道了前面的算法过程以及如何实现可能就已经够用了,但是深入的理解算法背后的数学原理对于更加灵活的应用是很有帮助的,本文致力于多角度多方面地向大家展示Adaboost算法,希望能够帮助大家深入理解集成学习的特点。出于这样的初衷,后面我们将介绍一些算法的数学原理和算法复杂性的分析。


基于加性模型的推导:


Adaboost的推到方式有很多种,主要有误差界、加性模型等,本文主要从加性模型的角度来推导Adaboost。


由基础模型组合起来的最终模型:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


其中ht(x)表示基础模型。


为该加性模型定义一个指数损失函数:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


其中y表示数据真实的类别。


因此,在给定训练集(m个样本)的条件下,学习加性模型H(x)就变成了上述损失函数最小化问题:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


根据H(x)的定义,通过优化上式,我们可以得到第t轮迭代时最优的α和h(x):

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


记分类错误率εt为:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


并且设: 640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


则有:

独家 | 一文读懂Adaboost_第11张图片


设:640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


640?wx_fmt=png&wxfrom=5&wx_lazy=1,并由εt的定义可得:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


这便得到了基础模型的组合系数,再回头看每轮提升过程中样本权值的更新过程:


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


可知:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


上述权值递推关系经归一化即得:

独家 | 一文读懂Adaboost_第12张图片


由此便推导出了Adaboost算法过程。实际上,这种通过从前到后每步只学习一个基础模型及其系数,从而最小化整体的损失函数的方法就是前向分步算法,也就是说Adaboost算法是前向算法的一个特例。


训练误差分析


对于Adaboost模型,其最终模型训练误差的上界是可以推导出来的,如下所示:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


也就是说,Adaboost最终模型的训练误差上界可以

独家 | 一文读懂Adaboost_第13张图片确定,这个结论可以证明如下:


独家 | 一文读懂Adaboost_第14张图片

独家 | 一文读懂Adaboost_第15张图片


算法分析


通过2.2算法的伪代码我们可以分析一下Adaboost算法。


分析算法的性能(收敛性、复杂度):


在此处的分析中,我们忽略基础模型优化的复杂度,默认基础模型是非常简单的模型。在伪代码的第2行的循环内,第4行计算εt以及第6行计算$Z_{t}$的时间均可表示为O(m),内层的for循环也是O(m)复杂度的。因此,整个模型的复杂度可以表示为O(mT)。当然,在实际的应用中,如果基础模型优化本身的复杂度超过O(m),那么整个模型的复杂度也会随之线性增大,对于具体的基础模型应该具体的分析其复杂度。


前面已经说明了Adaboost算法其最终模型训练集的误差是有上确界的,也就是说该算法是确切可以收敛到误差界的。这一点保证了Adaboost算法的可收敛性。


算法的优劣势:


前面就Adaboost算法分析了这么多,那么它到底有哪些优势,又有哪些不足呢?

 

优点:

  • 非常容易训练,实现起来比较容易

  • 泛化错误率低(预测性能好),不易过拟合

  • 不需要调节很多参数,最多修改一下基础模型的数量

  • 适用范围广:二分类问题,多分类问题,回归问题

 

缺点:

  • 对于离群值比较敏感

 

Adaboost的实际应用


目前,大家都知道计算机视觉非常的火,这当然得益于deep learning快速发展,然而在2012年之前,用于做人脸识别等图像检测的方法中,Adaboost占了很大比例。早在2001年Paul Viola和Michael Jones利用Adaboost组合基于Haar特征的弱分类器,使得人脸检测速度大幅度提升。近年来,在Kaggle等公开的竞赛中,Adaboost算法也被广泛采用,而且大部分时候表现都不错,比如将adaboost用在垃圾邮件检测、手写数字识别等项目中。另外,Adaboost模型训练完成后,利用各个基础模型的组合权值系数可以获取特征的重要性顺序,也就是说,Adaboost还可以用于特征提取。

 

总结


集成学习表示的是一种学习框架,主要包含有三种学习方式:boosting, bagging 和 stacking。本问集中在boosting的学习方式,通过具体的Adaboost算法向大家展示了集成学习的主要思想以及一些相关概念。Adaboost算法通过将分类能力比较弱的基础分类器按照训练出来的组合系数组合成强分类器,以实现良好的预测性能,在训练的过程中不断提高上次训练错误分类样本的权重,从而提升整体模型分类能力。


在本文中我们利用简单的例子编码实现了Adaboost算法,说明了其实际工作的原理。Adaboost算法可以利用加性模型的损失函数最小化来推导出来,并且具有确切的误差界,说明了模型的收敛性。最后对于boosting的方法值得注意的一点是,训练的过程改变的是样本的权重,并没有改变样本本身,权重的作用一般体现在分类误差的计算中,当然也有人利用权重分布来对样本进行抽样,这种方法也是可行的,但并不是boosting的核心方式。


想要了解更多集成学习的框架和模型,请关注我们后续系列文章。


原文发布时间为:2017-08-14 

本文作者:轩辕

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”微信公众号

你可能感兴趣的:(人工智能,python)