[机器学习]AdaBoost学习笔记(一):原理

前言

八月和九月参加了阿里天池的安全算法挑战赛,用了很多的集成模型,GBDT、XGBoost等等。对于刚入门的我来说,在比赛中纯粹把这些模型当成API函数,并没有了解太多的原理。现在比赛结束了(成绩不理想),想整理一些关于和树有关的经典机器学习模型来趁热打铁,所以就从AdaBoost开始整理了。

这里是LeeTioN的博客

背景知识

集成学习

在谈及AdaBoost之前,我们来看一下集成学习(ensemble learning)的概念。

集成学习通过构建并结合多个学习器来完成学习任务,通过该种方式可以获得比单一学习器显著优越的泛化性能。

其实日常生活中,我们在做出一些决定的时候,往往并不只是听从一个人的意见,而是尽可能地多地问身边的人,因为一个人的想法是局限的。同样在机器学习里面也是相似的。

一个学习器会有它的局限性,我们如果想要做到更好的预测效果,往往需要多个学习器来共同做预测,从而达到更准确的效果。

简单来说,集成学习的思想就是利用众人的力量,将多个学习器应用到同一个学习任务中,通过一种投票(voting)的方式,比如少数服从多数,最后做出决定。

拿我们常见的二分类问题来说,预测结果 y{1,+1} y ∈ { − 1 , + 1 } ,假设我们有 T T 个基分类器 hi ,若每个基分类器的重要性相同(有相同的权重),则最后的分类结果为

H(x)=sign(Ti=1hi(x)) H ( x ) = s i g n ( ∑ i = 1 T h i ( x ) ) .

那么随之有一个问题,我们如何去生成基分类器?目前来说,有两大类:

  • 基分类器存在强依赖关系(串行生成)
  • 基分类器不存在强依赖关系(并行生成)

简单来说是大家常见的Boosting 和 Bagging,然后我们来看一下Boosting。

Boosting

Boosting在不同版本的叫法有所不同——目前看到的共有提升助推增强三种翻译方式。

Boosting在分类问题中,通过训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能。当我们想训练 T T 个分类器时,先从初始的训练集中学习到第一个分类器,根据现有的基学习器的表现对样本分布进行调整,使得先前分错的训练样本受到更大的关注。接着,再进行循环,生成下一个基分类器,直到拥有T个基分类器。

引用李航老师在《统计学习方法》中的一句话,来说明Boosting的关键。

对于提升方法(Boosting)来说,有两个问题需要回答:一是在每一轮如何改变训练数据的权值或概率分布;二是如何将弱分类器组合成一个强分类器。

AdaBoost思想

1995年,AdaBoost算法由Freund和Schapire提出,对于以上提及的Boosting要解决的两个问题,AdaBoost是这样做的:

  1. 对于训练样本的权重更改,提高前一轮被错分样本的权值,降低被正确分类的样本权值。
  2. 对于弱分类器组合,AdaBoost采取通过误差率大小来决定每个分类器的权重大小。

接下来我们来详细地看一下AdaBoost算法。

AdaBoost 算法

算法步骤

输入:训练集数据 T={(x1,y1),(x2,y2),,(xN,yN)} T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋅ ⋅ ⋅ , ( x N , y N ) } ,
yiY={1,+1} y i ∈ Y = { − 1 , + 1 }

输出:集成分类器 G(x) G ( x )

  1. 对每个样本赋予相同的初始权重 1N 1 N ;

  2. k=1 k = 1 K K 循环执行(假设我们要生成K个基分类器);

  3. 用加权后的样本拟合新的基分类器,并计算第 k k 个模型的误差

    ek=P(Gk(xi)yi)=i=1Nωki I(Gk(xi)yi)

  4. 计算第 k k 个基分类器Gk(x)的权重系数

    αk=12log1ekek α k = 1 2 l o g 1 − e k e k

  5. 对下一次的循环做出训练集样本的权重更新

    Zk=Ni=1wki exp(αkyiGk(xi)) Z k = ∑ i = 1 N w k i   e x p ( − α k y i G k ( x i ) )

    zki=wki exp(αkyiGk(xi)) z k i = w k i   e x p ( − α k y i G k ( x i ) )

    对于第 k+1 k + 1 次循环中的训练集各个样本中的权重

    wk+1,i=zkiZk w k + 1 , i = z k i Z k

  6. 满足并跳出循环,构建基分类器的线性组合

    f(x)=Kk=1αkGk(x) f ( x ) = ∑ k = 1 K α k G k ( x ) ,最后 G(x)=sign(f(x)) G ( x ) = s i g n ( f ( x ) )

前向分步算法

上一节我们看到了AdaBoost算法对于二分类问题处理的一般流程,这一节我们来看一个比AdaBoost更一般化的算法——前向分步算法。

首先,我们来看一个概念——加法模型。上一节的算法步骤6中,我们给出了每一轮迭代中的基分类器的线性组合

f(x)=Kk=1αkGk(x) f ( x ) = ∑ k = 1 K α k G k ( x )

而加法模型很简单,仅仅是对于该函数式做出了抽象化的操作——

f(x)=Kk=1βk b(x;γm) f ( x ) = ∑ k = 1 K β k   b ( x ; γ m )

对于这里的参数 γm γ m ,它在AdaBoost算法里就是基分类器的分类阈值 (详情请参考李航老师的《统计学习方法》中的8.1.3 AdaBoost的例子,其中提到了基分类器的具体形式,其中阈值 v v 则是加法模型中所指代的γm)。

如果我们现在要求解这样一个加法模型的话,我们一共有 2K 2 K 个参数要求解(假设 βmγm β m 、 γ m 都是 11 1 ∗ 1 维)。如果一口气把这么多参数都求解,那么求解过程是特别复杂。

大家可以想象一下中学阶段求解三元、四元一次方程组通常就很头痛了(学神除外=。=),所以我们就想着去分步求解这一过程。(其实AdaBoost用的就是这样的一个分步方法)

到这里,大家其实可以看出来了,AdaBoost其实是前向分步算法的一个特例。那么这个特例特别在哪里呢?我们来一一解读一下。(对于前向分步算法,详情请看李航老师的《统计学习方法》中的8.3.1 节)

  1. 前向分步算法中,提及到的损失函数 L(y,f(x)) L ( y , f ( x ) ) 是一般化的,而AdaBoost中则将这一损失函数具体为指数函数。
  2. AdaBoost中的每一个基分类器尽可能的简单,比如每个基分类器为一颗树桩(Stump),即只有一个分界条件,非黑即白。

参考文献

[1] 李航《统计学习方法》
[2] 周志华《机器学习》
[3] 马克斯 库恩《应用预测建模》
[4] 林轩田 《机器学习技法》

总结

AdaBoost作为Boosting家族最经典的算法之一,非常易于理解,应用起来效率也非常高,下一篇将介绍关于AdaBoost的应用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值