本讲主要内容
4 集成学习(下)
4.3 Boosting
4.3.1 AdaBoost
4.3.2 损失函数回顾
4.3.3 提升树(Boosting Trees)
4.3.4 正则化
4 集成学习(下)
4.3 Boosting
提升(Boosting)是一种常用的统计学习方法,在分类问题中,它通过改变训练样本的权重,学习多个分类器(一般是弱分类器),并将这些分类器线性组合,最终提高分类器的性能。而针对于这种提升方法而言,需要回答两个问题,一是在每一轮如何改变训练样本的权值或概率分布;二是如何将弱分类器组合成一个强分类器。
----摘自《统计学习方法》
4.3.1 AdaBoost
Adaboost属于Boosting一种,那么,它是如何回答上面两个问题的呢?针对第一个问题,Adaboost的做法是提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类的样本的权重。从而使得那些被错误分类的样本由于其权值被加大而受到后一轮弱分类器的更多的关照(关注)。而针对第二个问题,Adaboost采取加权多数表决的方法,加大分类误差率小的弱分类器的权重,使其在最终的分类器表决中起较大作用,减小分类误差率大的弱分类器的权重,使其在表决中起较小的作用。总结起来,有两个权重的概念,一个是增大错误分类样本的权重,一个增大分类误差率小的弱分类器的权重。
算法
古人有云,吃亏是福。AdaBoost显然就是这样一种善于“积(chi)福(ku)”的方法。在每一轮的迭代中,它都想办法从上一轮迭代中“欺负”它的样本身上学到更多东西,即提高那些错误分类数据的权值。同时,AdaBoost还是一种非常有自知之明的方法,它知道自己那些地方做得好,哪些地方做得不好,据此给分类误差率小的基本分类器以大的权值,给分类误差率大的基本分类器以小的权值。AdaBoost的算法流程如下:
算法描述:
1)首先初始化各个样本的权重,为1/m,m为样本数量,有些书本可能会这样初始化,每个正样本权重为1/2u,每个负样本权重为1/2v,u+v等于样本总数。这对于得到最终的强分类器并没有影响。
2)开始进行迭代,在每一轮的迭代中:
◆ 寻找到一个弱分类器使得在当前样本权重分布下的错误率最小;
◆ 当确定了这样一个弱分类器后,计算错误率;
◆ 根据误差率计算此弱分类器在最终的强分类器中所占的权重;
◆ 根据公式更新训练样本的权值分布;
◆ 将此弱分类器加入到当前迭代次数下的强分类器中。
3)直到迭代次数达到指定数值或者强分类器在训练集上的误差达到指定范围停止迭代。
从以上的论述中我们可以得到AdaBoost的两个特点,一是不改变所给的训练数据,而不断改变训练数据权值的分布,使得训练数据在基本分类器的学习中起不同的作用;二是利用基本分类器的线性组合构建最终分类器。
例子
-
第一次迭代我们给所有样本相同的权重,找到当前权重分布下,分类误差率最小的一个弱分类器;
-
第二次迭代,经过上一轮弱分类器分类之后,有三个样本被分错,加大其权重,找到在当前权重分布下,误差率最小的一个弱分类器;
-
以此类推;
-
最终,我们将得到的一系列弱分类器加权组合起来就得到了一个强分类器(实黑线所示)。
策略
细心的读者可能发现了,AdaBoost的学习与以往的机器学习算法不同,我们已经学习了AdaBoost算法,AdaBoost[4]算法是早在1995年就被提出,但是一直无人能够给出一个合理的算法解释,直到2000年才有人用很好的理论[3]来解释它的模型以及损失函数。那么它的模型和损失函数是什么呢?为什么弱分类器的分类误差计算公式及其权值更新公式是算法中描述的那样的呢?首先给出结论:
AdaBoost算法是前向分步算法的一个特例。这时,模型是基本模型组成的加法模型,损失函数是指数函数,算法是前向分步算法。损失函数:
模型:
如何得到在训练集上的分类误差率,的系数,以及训练集样本的权值更新公式呢?
在证明前,我们先介绍前向分步算法。给定一个加法模型:
其中,b为基函数,γm为基函数的参数,βm为基函数的系数。在给定训练数据及损失函数L(y,f(x))的条件下,学习加法模型f(x)成为经验风险最小化即损失函数最小化问题:
通常这是一个复杂的优化问题,一次性求解所有基函数的参数以及其系数比较困难。前向分步算法(forward stagewise algorithm)求解这一优化问题的思路是:因为学习的是加法模型,如果能够从后向前,每一步只学习一个基函数及其系数,逐步逼近其目标函数式,那么就可以简化优化的复杂度。具体地,每步只需优化如下损失函数:
了解了前向分步算法,下面我们就要证明上述结论了。
从我们的模型入手:
假设表示第0次迭代后的模型,表示第m次迭代后的模型,有:
那么经过m次迭代所产生的最终模型,表示为前m-1次迭代产生的模型,加上第m次迭代产生的加权基函数。带入我们的损失函数:
即第m轮迭代的基函数以及其系数必然满足下述极小化式:
对上式变形:
其中,注意到这一项是与以及无关的。
即:
进一步展开,
其中从第一步到第二步,因为
同异号可用指示函数表示。
因为与以及无关,可以看到所求的满足下列极小化式(蓝色方框)
假设我们已经求得了,那接下来求它的系数。对求偏导,令其等于0:
即得:
其中,
对进一步化简:
可以看到与的公式是不是与算法中的一模一样呢?最后推导出训练集样本权值的更新公式:
由模型:
以及权值:
可以方便得到:
看完上述内容,是不是对AdaBoost理解更加深刻了一些呢?
4.3.2 损失函数回顾
-
理想的0-1损失函数
0-1损失是指,预测值和目标值不相等为1,否则为0:
这类损失函数并不常用,因为其有间断点,不可导。
-
基于最小二乘法的分类
最小二乘法是线性回归的一种,OLS将问题转化成了一个凸优化问题。在线性回归中,它假设样本和噪声都服从高斯分布,最后通过极大似然估计(MLE)可以推导出最小二乘式子。最小二乘的基本原则是:最优拟合直线应该是使各点到回归直线的距离和最小的直线,即平方和最小。换言之,OLS是基于距离的,而这个距离就是我们用的最多的欧几里得距离。
这类损失函数的优点是有解析解,但它的缺点也很明显,就是对“坏点”非常敏感,并且当f(x)的值很大时损失也很大,“妒忌心”很重。
-
SVM的合页损失函数
在机器学习算法中,hinge损失函数和SVM是息息相关的。在线性支持向量机中,最优化问题可以等价于下列式子:
接下来对这个式子做一下变形,令
于是,原式就变成了
若进一步表示成
那么它和下式就非常像了
前半部分中的就是hinge损失函数,而后面相当于L2正则项,说明SVM损失函数是正则化了的hinge损失函数。这类损失函数线性惩罚误分类的点,鲁棒性较强。
-
AdaBoost的指数损失函数
在上文中我们已经讨论过,AdaBoost方法的损失函数是指数损失函数。这类损失函数连续,可导,接近理想的0-1损失,对太正确的点惩罚低,收敛快,误分类点的损失指数增长,鲁棒性较差。
-
逻辑斯蒂回归的指数损失函数
AdaBoost的损失函数可以改成Logistic Regression的损失函数,从而更加鲁棒,这样的算法称作“GentleBoost”。在每次迭代时,基于最小二乘去做一个加权回归,最后所有回归函数的和作为最终的分类器。
这几种损失函数随y*f(x)的变化如下图所示。
4.3.3 提升树(Boosting Trees)
提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习中性能最好的方法之一。
模型
提升方法实际采用加法模型(即基函数的线性组合)与前向分步算法。以决策树为基函数的提升方法成为提升树。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。只有一个条件的基本分类器可以看做是由一个根结点直接连接两个叶结点简单决策树,即所谓的决策树桩(decision stump)。提升树模型可以表示为决策树的加法模型:
其中,T(x; θm)表示决策树;θm为决策树的参数;M为树的个数。提升树中树之间没有权重,或者说它们的权重都是一样的,树之间是独立的,训练样本之间也没有权重的概念,这是提升树和随机森林、AdaBoost之间的区别。
算法
提升树算法采用前向分步算法。首先确定初始提升树f0(x)=0,第m步的模型是:
其中,f m-1(x)为当前模型,通过经验风险最小化确定下一决策树的参数θm:
由于树的线性组合可以很好地拟合训练数据,即使数据中的输入与输出之间关系很复杂也是如此。所以提升树是一个高功能的学习算法。
不同问题中的提升树学习算法的主要区别在于使用的损失函数不同。例如用平方损失函数的回归问题,用指数损失函数的分类问题,以及用一般损失函数的一般决策问题。
-
回归问题
回归问题提升树使用以下前向分步算法:
在前向分步算法的第m步,给定当前模型f m-1(x),需求解
得到第m棵树的参数。
当采用平方误差损失函数时,
其损失变为
r是当前模型拟合数据的残差(residual)。所以,对回归问题的提升树算法来说,只需简单地拟合当前模型的残差。
-
一般决策问题-梯度提升树(GBDT)
对于梯度提升树,其学习流程与提升树类似,只是不再使用残差作为新的训练数据而是使用损失函数的梯度作为新的新的训练数据的y值,具体的来说就是使用损失函数对f(x)求梯度然后带入fm-1(x)计算:
GDBT与提升树之间的关系:
提升树模型每一次的提升都是靠上次的预测结果与训练数据的label值差值作为新的训练数据进行重新训练,GDBT则是将残差计算替换成了损失函数的梯度方向,将上一次的预测结果带入梯度中求出本轮的训练数据,也就是说这两种模型在生成新的训练数据时采用了不同的方法。在使用平方误差损失函数和指数损失函数时,提升树的残差求解比较简单,但是在使用一般的损失误差函数时,残差求解起来不是那么容易,所以就使用损失函数的负梯度在当前模型的值作为回归问题中残差的近似值。
上述给出的提升树是损失函数采用平方损失的版本,当采用其他损失函数的时候,可以将其细分为若干类算法。
注:该表来源于《Machine learning:A Probabilistic Perspective》p587.
工具
✓ Ensemble Learning Framework
(http://elf-project.sourceforge.net/)
✓ AdaBoost Matlab Toolbox
(http://graphics.cs.msu.ru/en/science/research/machinelearning/adaboosttoolbox)
✓ XGBoost
(https://github.com/dmlc/xgboost)
✓ LightGBM
( https://github.com/Microsoft/LightGBM/wiki/Features)
其中XGBoost以及微软推出的LightGBM可以说是Boosting利器,其在cup以及kaggle上的众多数据挖掘竞赛中,帮助参赛者取得了很多优秀的成果。关于XGBoost以及LightGBM的安装和使用,笔者将会在近期推送一篇相关文章,帮助大家快速上手。
4.3.4 正则化
在这一部分我们来讨论Boosting方法中的几种正则化方法。
验证集
为了防止过拟合,首先我们可以设置一个验证集,在验证集上调整叶子结点的个数J和树的课数M。寻找最优M的过程类似神经网络的Early Stopping策略。
Early stopping:一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。 Early stopping方法的具体做法:1. 首先将训练数据划分为训练集和验证集(划分比例为2:1); 2. 在训练集上进行训练,并且在验证集上获取测试结果(比如每隔5个epoch测试一下),随着epoch的增加,如果在验证集上发现测试误差上升,则停止训练; 3. 将停止之后的权重作为网络的最终参数。
Shrinkage
我们可以采用的第二种正则化策略是对加入模型的树进行缩放:
这里的缩放因子我们可以将其理解为学习率。那么类比学习率对模型的影响,我们不难得出这样的结论:相同的M,较小的v导致较大的训练风险;v较小,需要较大的M;v和M共同控制模型的泛化能力。在实际应用中通常采用使用较小的v ,通过early stopping选择M。
Penalty
最后要介绍的这种策略是一种“广泛撒网,重点选拔”的方法,即先训练出大量的树,然后选择好的树放到最终的模型中。大致的回归算法如下所示。
即在原本的策略中加一个罚项,从而训练并选出泛化能力更好的模型。
注:文中所有推导均可在课件中找到,回复「课件」二字即可领取。
Reference
[1] 李航 . 统计学习方法 . 清华大学出版社,北京(2012)
[2] 周志华 . 机器学习 . 清华大学出版社,北京(2016)
[3]Friedman, Jerome, T. Hastie, and R. Tibshirani. "Additive logistic regression: a statistical view of boosting (With discussion and a rejoinder by the authors)." Annals of Statistics 28.2(2000):337-374.
[4]Yoav Freund, and Robert E. Schapire. A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting ☆, ☆☆. Computational Learning Theory. Springer Berlin Heidelberg, 1995:119-139.