01 起
在之前的文章中,我们学习了几种经典的分类算法:KNN,Naive Bayes,Decision Tree,Logistic Regression,SVM。
接下来我们学习一种方法来提升分类效果,这种方法的核心思想就是:三个臭皮匠,顶个诸葛亮。
我们先从集成方法讲起,简单介绍Bagging和Boosting,然后着重介绍提升方法(Boosting),然后给出一种常用的提升方法Adapt Boost(AdaBoost),最后介绍一种AdaBoost的特例,提升树。
02 几种集成方法
学习了那么多经典的分类算法,我们会发现,算法有各自的优势和缺点;处理了那么多数据,我们会发现,数据有好坏均衡之分;那么你有没有想过,将不同的分类器、不同的数据集择优训练,结合得到一个更好的分类器呢?
这就是集成方法,集成方法有这样几种思路:
- 不同基本分类器的集成
- 同一基本分类器在不同参数设置下的集成
- 数据集不同部分分配给不同或相同基本分类器后的集成(Bagging(相同分类器时))
- 同一数据集不同权值分配给同一基本分类器的集成(Boosting)
其中第三种思路,数据集不同部分分配给相同基本分类器后的集成,叫做自举汇聚法(Bootstrap Aggregating),即Bagging;第四种思路,同一数据集不同权值分配给同一基本分类器的集成叫提升方法,即Boosting,也是本文的重点。
这两种方法的区别如下,
Bagging过程:
- 建立S个新数据集
从原始数据集选择S次后,得到S个新数据集:新数据集与原数据集大小相等,各数据集都是在原数据集中随机选择一个样本来进行替换得到的,即可以多次选择同一个数据放入某个新数据集中,而原数据集有些数据则不会存在于某个新数据集中。 - 学习分类器
将某个学习算法分别作用于每S个新数据集,得到S个分类器 - 投票分类
要对新数据分类时,用学习到的S个新分类器进行分类,选择分类器投票结果中最多的类别,作为该数据的最终分类结果
相比于Bagging,Boosting有这样一些不同点:
- 新数据集不同
Bagging,通过从原数据集中随机选择数据构造新数据集
Boosting,通过改变原数据集各数据权重来构造新的数据集 - 加权方式不同
Bagging,训练得到的分类器,等权重投票
Boosting,对训练得到的分类器加权求和得到最终分类器,权重与分类器分类正确率正相关
下面我们学习提升方法Boosting。
03 提升方法
基本思路
三个臭皮匠,顶个诸葛亮
对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。
基本概念
- 强可学习
一个概念/类,如果存在一个多项式的学习算法能够学习它,且正确率很高,那么就称这个概念是强可学习的 - 弱可学习
一个概念/类,如果存在一个多项式的学习算法能够学习它,但学习但正确率仅比随机猜测略好,那么就称这个概念是弱可学习的
一个概念强可学习的充要条件是这个概念是弱可学习的。那么,如果已经发现了弱可学习算法,那么能否将它提升为强可学习算法?
这就是提升方法的由来。
我们再来看看提升方法要解决的两个问题
1. 在每一轮如何改变训练数据的权值或概率分布?
提高那些被前一轮弱分类器错误分类样本的权值
降低那些被前一轮弱分类器正确分类样本的权值
(使得被错误分类的样本受到下一轮的更多关照)
2. 如何将弱分类器合成一个强分类器?
加权多数表决法:加大分类误差小的弱分类器权值,减小分类误差大的弱分类器权值
这就是提升方法的原理和基本思路,下面我们介绍一种常用且有效的提升方法。
04 AdaBoost
AdaBoost是Adapt Boost的缩写,即可适应提升方法,这种方法可以适应每次优化的模型的训练误差,使得每次训练的准确率都较上一次有尽可能大的提升。
AdaBoost算法
算法特点:不改变所给训练数据,通过不断改变训练数据权值的分布,使得训练数据在基本分类器中起不同的作用
我们可以认为AdaBoost算法是这样的二分类学习方法:
- 模型为加法模型
- 损失函数为指数函数
- 学习算法为前向分步算法
其中,前向分步算法是一种很重要的算法思想,我认为可以总结为:分而治之。其基本思路是:对于一个加法模型(如上述的f(x),如果能从前向后,每一步只学习一个基函数及其系数,逐步逼近目标函数,那么就可以简化优化的复杂度。如此,前向分步算法,将同时求解所有参数的优化问题简化为逐次求解各个参数的优化问题。
前向分步算法:
可以认为,AdaBoost是前向分步算法的特例。
AdaBoost总体来说是一种算法思路,并不是一种具体的算法,因为算法8.1中的步骤(a)的基本分类器并没有指定。如果我们将基本分类器设定为决策树,那么此时的算法就叫做“提升树”。
提升树是以分类树/回归树为基本分类器的提升方法(即,提升树是AdaBoost算法的特例,其基本分类器是决策树),被认为是统计学习中性能最好的方法之一。
不同的提升树算法
分类问题的提升树 (损失函数为指数函数)
算法:将算法8.1中的基本分类器限制为分类决策树即可-
回归问题的提升树 (损失函数为平方误差函数)
算法:
上述介绍的提升方法,损失函数都是指数或平方损失函数,当损失函数为指数函数或平方损失函数时,每一步的优化都很简单,但对一般损失函数而言,每一步的优化都不那么容易,那么能不能找到近似方法去求解呢?
能,这就是梯度提升算法,其关键点是,利用损失函数的负梯度在当前模型的值,作为回归问题提升树算法中残差的近似值,拟合一个回归树
05 总结
本文先从集成方法讲起,简单介绍Bagging和Boosting,然后着重介绍提升方法(Boosting),然后给出一种常用的提升方法Adapt Boost(AdaBoost),最后介绍一种AdaBoost的特例,提升树。
下期我们将利用Python3实现AdaBoost算法,敬请期待~
06 参考
《统计学习方法》 李航 Chapter8