深入浅出ML之Boosting家族

本文转自:http://www.52caml.com/head_first_ml/ml-chapter6-boosting-family/

写在前面

提升(boosting)方法是一类应用广泛且非常有效的统计学习方法。

在2006年,Caruana和Niculescu-Mizil等人完成了一项实验,比较当今世界上现成的分类器(off-the-shelf classifiers)中哪个最好?实现结果表明Boosted Decision Tree(提升决策树)不管是在misclassification error还是produce well-calibrated probabilities方面都是最好的分离器,以ROC曲线作为衡量指标。(效果第二好的方法是随机森林)

下图给出的是Adaboost算法(Decision Stump as Weak Learner)在处理二类分类问题时,随着弱分类器的个数增加,训练误差与测试误差的曲线图。
在这里插入图片描述
在这里插入图片描述
从图中可以看出,Adaboost算法随着模型复杂度的增加,测试误差(红色点线)基本保持稳定,并没有出现过拟合的现象。

其实不仅是Adaboost算法有这种表现,Boosting方法的学习思想和模型结构上可以保证其不容易产生过拟合(除非Weak Learner本身出现过拟合)。

下面我们主要是从损失函数的差异,来介绍Boosting的家族成员;然后我们针对每个具体的家族成员,详细介绍其学习过程和核心公式;最后从算法应用场景和工具方法给出简单的介绍。

Boosting

Boosting介绍

基本思想

Boosting方法基于这样一种思想:
对于一个复杂任务来说,将多个专家的判定进行适当的综合得出的判断,要比其中任何一个专家单独的判断好。很容易理解,就是”三个臭皮匠顶个诸葛亮”的意思

历史由来

历史上,Kearns和Valiant首先提出了”强可学习(strongly learnable)”和“弱可学习(weakly learnable)”的概念。他们指出:

在概率近似正确(probably approximately correct,PAC)学习框架中:

  1. 一个概念(一个类,label),如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个概念是强可学习的;
  2. 一个概念(一个类,label),如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么就称这个概念是弱可学习的。

Schapire后来证明了: 强可学习和弱可学习是等价的。 也就是说,在PAC学习的框架下,一个概念是强可学习的 充分必要条件 是这个概念是弱可学习的。 表示如下:
强可学习⇔弱可学习

如此一来,问题便成为:在学习中,如果已经发现了”弱学习算法”,那么能否将它提升为”强学习算法”? 通常的,发现弱学习算法通常要比发现强学习算法容易得多。那么如何具体实施提升,便成为开发提升方法时所要解决的问题。关于提升方法的研究很多,最具代表性的当数AdaBoost算法(是1995年由Freund和Schapire提出的)。

Boosting学习思路

对于一个学习问题来说(以分类问题为例),给定训练数据集,求一个弱学习算法要比求一个强学习算法要容易的多。Boosting方法就是从弱学习算法出发,反复学习,得到一系列弱分类器,然后组合弱分类器,得到一个强分类器。Boosting方法在学习过程中通过改变训练数据的权值分布,针对不同的数据分布调用弱学习算法得到一系列弱分类器。

这里面有两个问题需要回答:

  1. 在每一轮学习之前,如何改变训练数据的权值分布?
  2. 如何将一组弱分类器组合成一个强分类器?
    具体不同的boosting实现,主要区别在弱学习算法本身和上面两个问题的回答上。

针对第一个问题,Adaboost算法的做法是:

  1. 提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。
  2. 如此,那些没有得到正确分类的样本,由于其权值加大而受到后一轮的弱分类器的更大关注。

第二个问题,弱分类器的组合,AdaBoost采取加权多数表决的方法。具体地:

  1. 加大 分类误差率小 的弱分类器的权值,使其在表决中起较大的作用;减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。
  2. AdaBoost算法的巧妙之处就在于它将这些学习思路自然并且有效地在一个算法里面实现。

前向分步加法模型

英文名称:Forward Stagewise Additive Modeling

加法模型(addtive model)

在这里插入图片描述

前向分步算法

在给定训练数据及损失函数L(y,f(x))的条件下,学习加法模型f(x)成为经验风险极小化即损失函数极小化的问题:
在这里插入图片描述
通常这是一个复杂的优化问题。前向分布算法(forward stagwise algorithm)求解这一优化问题的思路是:因为学习的是加法模型,如果能够从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式(ml.1.6.1),那么就可以简化优化的复杂度。具体地,每步只需优化如下损失函数:
在这里插入图片描述
在这里插入图片描述

Boosting四大家族

Boosting并非是一个方法,而是一类方法。这里按照损失函数的不同,将其细分为若干类算法,下表给出了4种不同损失函数对应的Boosting方法:
在这里插入图片描述
二分类问题时损失函数示意图:
在这里插入图片描述

下面主要以AdaBoost算法作为示例,给出以下3个问题的解释:

  1. AdaBoost为什么能够提升学习精度?
  2. 如何解释AdaBoost算法?
  3. Boosting方法更具体的实例-Boosting Tree。

Adaboost

算法学习过程

Adaboost算法在分类问题中的主要特点:通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类性能。 AdaBoost-算法描述(伪代码)如下:
在这里插入图片描述
在这里插入图片描述

AdaBoost算法描述说明

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

示例:AdaBoost算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

训练误差分析

AdaBoost算法最基本的性质是它能在学习过程中不断减少训练误差,即在训练数据集上的分类误差率。 对于这个问题,有个定理可以保证分类误差率在减少-AdaBoost的训练误差界。

定理:AdaBoost训练误差界

在这里插入图片描述
证明如下:
在这里插入图片描述
在这里插入图片描述

定理:二类分类问题AdaBoost训练误差界

在这里插入图片描述
在这里插入图片描述
AdaBoost训练误差指数速率下降
在这里插入图片描述
推论表明,在此条件下,AdaBoost的训练误差是以指数速率下降的。这一性质对于AdaBoost计算(迭代)效率是利好消息。

注意:AdaBoost算法不需要知道下界γ,这正是Freund和Schapire设计AdaBoost时所考虑的。与一些早期的提升方法不同,AdaBoost具有适应性,即它能适应弱分类器各自的训练误差率。这也是其算法名称的由来(适应的提升)。Ada是Adaptive的简写。

前向分步加法模型与Adaboost

AdaBoost算法还有另一个解释,即可以认为AdaBoost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法时的学习方法。

根据前向分步算法可以推导出AdaBoost,用一句话叙述这一关系.

AdaBoost算法是前向分步加法算法的特例
此时,模型是由基本分类器组成的加法模型,损失函数是指数函数。

证明:前向分步算法学习的是加法模型,当基函数为基本分类器时,该加法模型等价于AdaBoost的最终分类器:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

AdaBoost算法缺点

在这里插入图片描述

Boosted Decision Tree

提升决策树是指以分类与回归树(CART)为基本分类器的提升方法,被认为是统计学习中性能最好的方法之一。

提升决策树简称提升树,Boosting Tree.

提升树模型

提升树模型实际采用加法模型(即基函数的线性组合)与前向分步算法,以决策树为基函数的提升方法称为提升树(Boosting Tree)。
对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。
在这里插入图片描述

提升树算法

在这里插入图片描述
由于树的线性组合可以很好的拟合训练数据,即使数据中的输入和输出之间的关系很复杂也是如此,所以提升树是一个高功能的学习算法。

提升树家族

不同问题的提升树学习算法,其主要区别在于损失函数不同。平方损失函数常用于回归问题,用指数损失函数用于分类问题,以及绝对损失函数用于决策问题。

二叉分类树

对于二类分类问题,提升树算法只需要将AdaBoost算法例子中的基本分类器限制为二叉分类树即可,可以说此时的决策树算法时AdaBoost算法的特殊情况。
损失函数仍为指数损失,提升树模型仍为前向加法模型。

二叉回归树

在这里插入图片描述
回归问题提升树-前向分步算法
在这里插入图片描述

回归问题提升树-算法描述

在这里插入图片描述

Gradient Boosting

提升树方法是利用加法模型与前向分布算法实现整个优化学习过程。Adaboost的指数损失和回归提升树的平方损失,在前向分布中的每一步都比较简单。但对于一般损失函数而言(比如绝对损失),每一个优化并不容易。

针对这一问题。Freidman提出了梯度提升(gradient boosting)算法。该算法思想:

利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中残差的近似值,拟合一个回归树。

损失函数的负梯度为:
在这里插入图片描述

Gradient Boosting-算法描述

在这里插入图片描述
算法解释:
第(1)步初始化,估计使损失函数极小化的常数值(是一个只有根结点的树);
第(2)(a)步计算损失函数的负梯度在当前模型的值,将它作为残差的估计。(对于平方损失函数,他就是残差;对于一般损失函数,它就是残差的近似值)
第(2)(b)步估计回归树的结点区域,以拟合残差的近似值;
第(2)©步利用线性搜索估计叶结点区域的值,使损失函数极小化;
第(2)(d)步更新回归树。


更多案例请关注“思享会Club”公众号或者关注思享会博客:http://gkhelp.cn/

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值