集成学习与Adaboost
  集成学习在上一节已经介绍过了,集成算法-随机森林,一般来说集成算法可以分为两类:Boosting和Bagging,而上次我们详细介绍了Bagging中的代表算法随机森林。但是Boosting中的算法却一个也没有提,于是这篇文章,就主要介绍Boosting的最常见的一个集成算法:Adaboost。
  Adaboost算法的核心思想就将多个弱学习器进行组合成一个强学习器,就是三个臭皮匠顶个诸葛亮地道理。但是并没有这么简单,说组合就能组合,多个弱学习器如何组合得到的效果才能最好,这是一个非常重要的重点。在前面随机森林中我们学习到了要想组合多个弱学习器得到很好的效果需要满足弱学习器具有好而不同的特点,在随机森林中,我们使用自助采样法使得多个弱学习器学习的数据集不同,从而使得弱学习器不同,这是一种可行得学习方法。在今天要学习的Boosting中,(也就是Adaboost中),我们是对一个数据集不断进行学习,只不过每次学习的数据集其权重不同,而这个权重就是我们说的“不同”。后面我们再详细介绍,在这里只需要直到Adaboost算法的思想就行,至于为什么我们可以不改变样本点( Xi,yi),而只需要改变样本点的权重占比wi即可。这里就是Adaboost算法独特的地方,首先明确一点,我们这里介绍的算法只针对分类问题,也即预测值是离散的学习问题(Adaboost可以解决回归问题,只不过在本节不介绍)。在之前学习决策树的时候,我们说学习一个决策树依靠的是决策树的损失函数Cα(T),标准可以选取最小二乘(回归问题)或者基尼指数(分类问题)。但是在Adaboost算法中,我们计算弱分类树的误差使用的是特别的函数,这个函数和样本的权值分布有关。
  下面会详细介绍Adaboost算法从0实现的细节

细说Adaboost分类算法
  这里叙述的Adaboost算法主要是针对分类问题。
  假设给定一个二分类问题的训练数据集:



数据集学习一系列的基本分类器,也叫弱学习器,并将这些弱分类器线性组合成一个强分类器,注意是线性组合,说明每个弱分类器肯定就会有一个系数。
  算法训练开始前,我们需要给训练集样本赋予初权值。此时训练数据集具有均匀的权值分布,设



这个误差其实就是用来评价我们分类模型学习的好坏的,而从公式中也可以看出,误差就是分类错误样本的权值的累加。




数据集的权重分布进行一个更新,这个更新是Adaboost算法的重点,我们只有对样本权重进行一个更新,提高在第一个弱分类器中误分类的点的权重,才能使得在第一个弱分类器中分类错误的点在第二个弱分类器中被更加注意,这样在第二个弱分类器中就会对第一个若分类器分类错误的点进行照顾,



经过上述式子的更新,得到的第二代权值分布情况D2。注意不管是第一代还是第二代,我们的权值分布D的总和应该为1。
Adaboost算法就训练往后迭代,使用第二代的数据训练第二个弱分类器。
算法中还有几个点或者说是规律可以看出,第i个弱分类器的线性系数为αi,这个系数的值可以说是由误差决定的,因为计算系数的式子中只有误差一个参量,而误差的范围是从0到1,我们遍历误差绘制加法系数的大小如图:



从图上可以看到,当误差小于0.5时,弱分类器的系数才是大于0的,这一点其实和真实情况一样,毕竟没人会要一个分类错误率都超过一半的分类器,那还不如瞎猜。所以我们在遇到的绝大多数Adaboost算法中,系数都是正的,所有基学习器的误差不会超过0.5。



改变样本点数值大小而使得样本点在不同基学习器中发挥不同作用,这应该就是Adaboost算法的核心。
总结Adaboost算法的步骤如下:





这里的对数是自然对数。
(4)更新训练数据集的分布




上面是Adaboost算法的核心。最后我们会得到一个线性加和的模型,可以利用这个模型来对未知的数据进行预测,经实验,Adaboost的效果相比于常规的决策树要提升很多。


Adaboost算法与加法模型
  其实在学习Adaboost算法过程中,我们应该还需要掌握一个算法,叫做前向分布算法,而Adaboost算法也可以理解为前向分布算法的一个特例,即可以认为Adaboost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分布算法的二分类学习方法。
加法模型指的是对于:



行一个累加过程,我们称这种模型为加法模型。
在给定训练数据集以及损失函数L(y,f(x))的条件下,学习加法模型f(x)成为损失函数最小化问题:



其实这种学习方法在前面已经出现很多次了,例如在支持向量机中最大化间隔,后来也转化为学习参数α \alphaα的问题。在这里通常是有一个很复杂的优化问题,因为如果想要一次性学习找到全局最优的参数将会非常复杂,而前向分布算法就是将找到所有参数的优化问题分解成一个个小的子问题,即我们学习的是加法模型,前向分布算法就是从前往后,每一步只学习一个基函数及其系数,然后学习一步再学下一步,逐渐逼近目标,那么就可以将复杂的问题简单化。然而Adaboost就是前向分布算法最经典的一个例子。而前向分布算法有着其独特的学习方式:
对于一个集成模型f(x)来说,因为是加法模型,所以我们可以把f(x)拆成:



关于Adaboost是前向分布算法的一个特例是有相关证明的。
而且Adaboost模型是可以解决回归问题的,是在分类算法的基础上加以改进。