提升方法之AdaBoost算法

作为非数学专业出身看到密密麻麻的数学公式刚开始真的是非常头疼。算法的物理逻辑的时候尚能理解,但是涉及到具体的数学公式实现就开始懵逼了:为什么要用这个公式,这个公式是怎么推到的,这个公式达到什么样的效果?
这里结合自己的理解和画图,用最直白的语言对每个公式作用进行解剖。


一、AdaBoost核心概念总结

  1. 提升方法是将弱学习算法提升为强学习算法的统计学习方法。在分类学习中,提升方法通过反复修改训练数据的权值分布,构建一系列基本分类器(弱分类器),并将这些基本分类器线性组合,构成一个强分类器。代表性的提升方法是AdaBoost算法。(重点是:更新分类器的参数训练集的权重见下2

    AdaBoost模型是弱分类器的线性组合:

    f(x)=∑Mm=1αmGm(x)f(x)=∑m=1MαmGm(x)

    f(x)=∑^M_{m=1}\alpha _mG_m(x)

    • MMM表示该提升树共有M" role="presentation" style="position: relative;">MMM个弱分类器组成
    • Gm(x)Gm(x)G_m(x)表示第mmm个弱分类器
    • αm" role="presentation" style="position: relative;">αmαm\alpha_m为第mmm个弱分类器的参数(反应该分类器的重要性)
  2. AdaBoost算法的特点是通过迭代每次学习一个基本分类器。每次迭代中,核心思想是:提高那些被前一轮分类器错误分类数据的权值,而降低那些被正确分类的数据的权值。最后,AdaBoost将基本分类器的线性组合作为强分类器,其中给分类误差率小的基本分类器以大的权值,给分类误差率大的基本分类器以小的权值

  3. AdaBoost的训练误差分析表明,AdaBoost的每次迭代可以减少它在训练数据集上的分类误差率,这说明了它作为提升方法的有效性。(每次迭代误差递减且误差0≤ϵ&lt;0.5" role="presentation" style="position: relative;">0≤ϵ<0.50≤ϵ<0.50≤\epsilon )
  4. AdaBoost算法的一个解释是该算法实际是前向分步算法的一个实现。在这个方法里,模型是加法模型,损失函数是指数损失,算法是前向分步算法时的二分类学习方法。每一步中极小化损失函数。
  5. 提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习中最有效的方法之一。

AdaBoost是一种典型的提升树算法。

通过上面的总结我们看到,AdaBoost是一个神奇的算法,以精妙的方式通过更新数据集的权重以及各个弱分类器的参数组合成一个强分类器。那么它具体是怎么做到的呢?

二、AdaBoost算法推导

输入:训练数据集T=(x1,y1),(x2,y2),...,(xN,yN)T=(x1,y1),(x2,y2),...,(xN,yN)T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)},其中xi∈X⊆Rn,yi∈Y={−1,1}xi∈X⊆Rn,yi∈Y={−1,1}x_i\in X ⊆R^n,y_i\in Y=\{-1,1\},弱学习算法Gm(x)Gm(x)G_m(x);

输出:最终强化算法分类器G(x)G(x)G(x)
(1)初始化训练数据总和为1的权值分布:(初始权重为归一化后的均值既1N1N\frac 1N)

D1=(w11,...,w1i,...w1N),w1i=1N,i=1,2,...ND1=(w11,...,w1i,...w1N),w1i=1N,i=1,2,...N

D_1=(w_{11},...,w_{1i},...w_{1N}),w_{1i}=\frac 1N, i=1,2,...N
(2)对 m=1,2,...Mm=1,2,...Mm=1,2,...M:(弱分类器的个数)

(a)使用具有权值分布的DmDmD_m的训练数据集学习,得到基本分类器:(数据集XXX到{-1,1}的映射)

Gm(x):X−&gt;{−1,1}" role="presentation" style="text-align: center; position: relative;">Gm(x):X−>{−1,1}Gm(x):X−>{−1,1}

G_m(x):X->\{-1,1\}
(b)计算Gm(x)Gm(x)Gm(x)在训练数据集上的分类误差率:(公式不够简洁明了,其实总结下来非常好理解:误差率ememe_m=误分类样本的权值之和)

em=∑Ni=1P(Gm(xi)≠yi)=∑Ni=1wmiI(Gm(xi)≠yi)em=∑i=1NP(Gm(xi)≠yi)=∑i=1NwmiI(Gm(xi)≠yi)

e_m=∑^N_{i=1}P(G_m(x_i)≠y_i)=∑^N_{i=1}w_{mi}I(G_m(x_i)≠y_i)

  • 我们来考虑下误差ememe_m的取值空间:由于训练集权制之和为1,因此误差0≤em≤10≤em≤10≤e_m≤1。但是这样还不够。因为我们在选择分裂阈值的时候会选择一个最优或局部最优的取值来分裂,且当em=0.5em=0.5e_m=0.5是表明该分裂阈值对预测无贡献。因此最终得到的ememe_m的实际取值应小于em≤0.5em≤0.5e_m≤0.5。
  • 所以最终:0≤em≤0.50≤em≤0.50≤e_m≤0.5,且每次迭代误差ememe_m递减。这点对下面的参数理解很重要。

(c)计算Gm(x)Gm(x)G_m(x)的系数:(这里对数为自然对数)

αm=12log1−ememαm=12log1−emem

\alpha_m=\frac 12log\frac{1-e_m}{e_m}

  • 那么问题来了,为什么要用这个公式来计算更新每个基分类器的参数?我们先画个图出来观察下这个函数。(其中y轴为αmαm\alpha _m,x轴为误差ememe_m)

  • 由(2-b)我们得到误差ememe_m的取值范围为0≤em<0.50≤em<0.50≤e_m,结合该图可以可知0<αm<10<αm<10。
  • 另外可以发现,通过该函数的转换,弱分类器Gm(x)Gm(x)G_m(x)的误差的越小,参数αmαm\alpha_m越大。即实现了给分类误差率小的基本分类器以大的权值,给分类误差率大的基本分类器以小的权值

(d)更新训练数据集的权值分布:(该权值决定数据集的重要性,并让误差的计算变得简单)

Dm+1=(wm+1,1,...,wm+1,i,...wm+1,N)Dm+1=(wm+1,1,...,wm+1,i,...wm+1,N)

D_{m+1}=(w_{m+1,1},...,w_{m+1,i},...w_{m+1,N})

wm+1,i=wmiZmexp(−αmyiGm(x−i)),i=1,2,...Nwm+1,i=wmiZmexp(−αmyiGm(x−i)),i=1,2,...N

w_{m+1,i}=\frac {w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x-i)),i=1,2,...N

  • 这里yi={−1,1}yi={−1,1}y_i=\{-1,1\} 为真实值,Gm(xi)={−1,1}Gm(xi)={−1,1}G_m(x_i)=\{-1,1\}为预测值。当预测正确时yiGm(xi)yiGm(xi)y_iG_m(x_i)为1,反之为-1。
  • 令δmi=αmyiGm(xi)δmi=αmyiGm(xi)\delta_{m_i}=\alpha_my_iG_m(x_i),θmi=wmiZmθmi=wmiZm\theta_{mi}=\frac {w_{mi}}{Z_m}(把它看作一个用于归一化权值的加权平均常数)。权重wm+1,iwm+1,iw_{m+1,i}的更新函数可以简化为
    wm+1,i=θmiexp(δmi),i=1,2,...Nwm+1,i=θmiexp(δmi),i=1,2,...N

    w_{m+1,i}=\theta_{mi}exp(\delta _{mi}),i=1,2,...N画出y=wm+1,i=exp(δmi)y=wm+1,i=exp(δmi)y=w_{m+1,i}=exp(\delta_{mi})的图形来看一下:由于0<αm<10<αm<10,所以−1<δm,i<1−1<δm,i<1-1。且使得预测错误的数据集样本点更新后的权重变大,预测正确的权值变小,然后对所有权值进行归一化。这就是该函数实现的作用。(图中y=1是当αα\alpha无限接近于0时的情况:解释为,当αmαm\alpha_m权值越大,权重wm+1,iwm+1,iw_{m+1,i}更新改变的效果越明显。)

  • 这里,ZmZmZ_m是规范化因子,目的是使各数据集的权重进行归一化。理解为ZmZmZ_m=更新后的各数据集权重之和。
    Zm=∑Ni=1wmiexp(−αmyiGm(xi))Zm=∑i=1Nwmiexp(−αmyiGm(xi))

    Z_m=∑^N_{i=1}w_{mi}exp(-\alpha_my_iG_m(x_i))

(3)构建基本分类器的新型组合f(x)=∑Mm=1αmGm(x)f(x)=∑m=1MαmGm(x)f(x)=∑^M_{m=1}\alpha_mG_m(x),即:

G(x)=sign(f(x))=sign(∑Mm=1αmGm(x))G(x)=sign(f(x))=sign(∑m=1MαmGm(x))

G(x)=sign(f(x))=sign(∑^M_{m=1}\alpha_mG_m(x))
* 函数 sign()sign()sign()的意义是将正数判别为1,负数判别为-1,最终达到分类的目的。如图:

参数αmαm\alpha_m公式及权重wm+1,iwm+1,iw_{m+1,i} 其实是通过前向分步算法分别得到的αmαm\alpha_m和Gm(x)Gm(x)G_m(x)并使得fm(x)fm(x)f_m(x)再训练数据集TTT上的指数损失最小。具体的推导过程可参考《统计学习方法》–李航 第145~146页

三、AdaBoost算法实现步骤

上面解释了AdaBoost算法的具体内容。这里写出它的分布实现步骤再对上文算法加深下理解:

(1)假设训练数据集具有均匀的权值分布,即每个训练样本在基本分类器的学习中作用相同,这一假设保证第1步能够在原始数据上学习基本分类器G1(x)" role="presentation" style="position: relative;">G1(x)G1(x)G_1(x)。

(2)AdaBoost反复学习基本分类器,在每一轮m=1,2,…,Mm=1,2,…,Mm=1,2,…,M顺次地执行下列操作:

(a)使用当前分布DmDmD_m加权的训练数据集,学习基本分类器Gm(x)Gm(x)G_m(x)

(b)计算基本分类器Gm(x)Gm(x)G_m(x)再加权训练数据集上的分类误差率(即误分类样本的权值之和。这里要注意wmiwmiw_{mi}表示第mmm轮中第i" role="presentation" style="position: relative;">iii个实例的权值,且权值之和为1,即∑Ni=1wmi=1∑i=1Nwmi=1∑^N_{i=1}w_{mi}=1):

em=P(Gm(xi)≠yi)=∑Gm(xi)≠yiwmiem=P(Gm(xi)≠yi)=∑Gm(xi)≠yiwmi

e_m=P(G_m(x_i)≠y_i)=∑_{G_m(x_i)≠y_i}w_{mi}

(c)计算基本分类器Gm(x)Gm(x)G_m (x)的系数αmαm\alpha_m。alphamalphamalpha_m表示Gm(x)Gm(x)G_m(x)在最终分类器中的重要性。由上面(2-c)可知,当em≤1/2em≤1/2e_m≤1/2时,alpham≥0alpham≥0alpha_m≥0,并且αmαm\alpha_m随着ememe_m的减小而增大,所以分类误差率越小的分类器在最终分类器中的作用越大。

(d)更新训练数据的权值分布为下一轮作准备。式(2-d)的权重更新函数可以写成:

  • 由此可知,被基本分类器Gm(x)Gm(x)G_m (x)误分类样本的权值得以扩大,而被正确分类样本的权值却得以缩小。两相比较,误分类样本的权值被放大e(2αm)=em1−eme(2αm)=em1−eme^{(2\alpha_m)}=\frac{e_m}{1-e_m} 倍。因此,误分类样本在下一轮学习中起更大的作用。不改变所给的训练数据,而不断改变训练数据权值的分布,使得训练数据在基本分类器的学习中起不同的作用,这是AdaBoost的一个特点。

(3)线性组合f(x)f(x)f(x)实现MMM个基本分类器的加权表决。系数αm" role="presentation" style="position: relative;">αmαm\alpha_m 表示了基本分类器Gm(x)Gm(x)G_m (x)的重要性,这里,所有αmαm\alpha_m 之和并不为1。f(x)f(x)f(x)的符号决定实例x的类,f(x)f(x)f(x)的绝对值表示分类的确信度。利用基本分类器的线性组合构建最终分类器是AdaBoost的另一特点。

提升方法是即采用加法模型(即基数函数的线性组合)与前向分步算法,以决策树为基函数的提升方法称为提升树(boosting tree)。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。

喜欢本文的伙伴请关注我的博客http://ihoge.cn

提升方法之AdaBoost算法相关推荐

  1. python 梯度提升树_梯度提升方法(Gradient Boosting)算法案例

    GradientBoost算法 python实现,该系列文章主要是对<统计学习方法>的实现. 完整的笔记和代码以上传到Github,地址为(觉得有用的话,欢迎Fork,请给作者个Star) ...

  2. 机器学习--组合分类方法之AdaBoost算法实战(单层决策树原理代码详解)

    详细原理请看我的这篇文章,那里是纯理论说明,大量的数学推倒,建议大家多看看数学推倒,因为那才是本质,只有理解了本质你才知道如何使用这个算法,这个算法的优缺点你才会深入理解,搞算法其实就是搞数学,代码实 ...

  3. 机器学习--组合分类方法之AdaBoost算法

    组合分类器是一个复合模型,由多个分类器组合而成,个体分类器投票,组合分类器基于投票返回的标号预测,因此组合分类器通常比他的成员分类器更准确,通常组合分类器包含袋装.提升和随机深林,本节将主要讲解Ada ...

  4. 复现经典:《统计学习方法》第 8 章 提升方法

    本文是李航老师的<统计学习方法>[1]一书的代码复现. 作者:黄海广[2] 备注:代码都可以在github[3]中下载. 我将陆续将代码发布在公众号"机器学习初学者", ...

  5. Boosting(提升方法)之GBDT

    一.GBDT的通俗理解 提升方法采用的是加法模型和前向分步算法来解决分类和回归问题,而以决策树作为基函数的提升方法称为提升树(boosting tree).GBDT(Gradient Boosting ...

  6. Boosting AdaBoost算法

    提升和自适应提升方法 Boosting & AdaBoost 1 算法起源    在机器学习领域中,关键问题就是如何利用观测数据通过学习得到精确估计.但是,在实际应用领域中,构造一个高精度的估 ...

  7. 2022高教社杯数学建模思路 - 案例:AdaBoost 算法

    2022 高教社杯(国赛数学建模)思路解析 2022高教社杯ABCD赛题思路解析: https://blog.csdn.net/dc_sinor/article/details/126211983 集 ...

  8. 提升方法(boost)

    文章目录 提升方法(boost) 1. 前向分步算法 1.1. 算法流程 2. adaboost 2.1. 算法流程 2.2. adaboost的误差分析 3. adaboost与前向分步算法 4. ...

  9. 提升方法-Adaboost算法

    总第85篇 01|基本概念: 提升方法的基本思想:对于任何一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比任何一个专家单独的判断好. 先来看两个概念:强可学习和弱可学习. 在概率近似 ...

最新文章

  1. 架构师究竟要不要写代码?
  2. javascript 常用知识点
  3. Golang之gjson
  4. [COCI2017-2018#5] Pictionary(并查集+dfs)
  5. 零信任能力成熟度模型白皮书发布!内附下载资源
  6. 升级阿里云主机系统镜像
  7. Open3d之计算源点云与目标云的距离
  8. 4K标准---电视显示标准(ITU-R BT.2020)
  9. 怎样裁切图片?如何将图片剪裁成需要的大小?
  10. java isreachable_java-奇数InetAddress.isReachable()问题
  11. python——简单通讯录
  12. 单例模式之懒汉式单例模式
  13. 新手第二课:atof()函数的头文件
  14. freemarker生成word文档无法用office打开问题
  15. c# 局域网传输工具
  16. Vue是什么?在前端学习中有什么作用呢?
  17. c语言常用库函数使用要点,C语言常用库函数使用要点.doc
  18. 第2章第20节:使用项目编号让文字内容的布局更有条理 [PowerPoint精美幻灯片实战教程]
  19. 如何用数学课件制作工具画出固定长度的线段
  20. 环路补偿之“反向零点”分析 ---- 以“反相放大器”为例分析

热门文章

  1. .NET Core on K8S 学习与实践系列文章索引 (更新至20191126)
  2. [译]使用LazZiya.ExpressLocalization开发多语言支持的ASP.NET Core 2.x项目
  3. [翻译] NumSharp的数组切片功能 [:]
  4. 解决 VS2019 中.net core WPF 暂时无法使用 Designer 的临时方法
  5. 【NET CORE微服务一条龙应用】应用部署
  6. 轻量级的web框架[Nancy On .Net Core Docker]
  7. ASP.NET Core 静态文件及JS包管理器(npm, Bower)的使用
  8. 计算机应用技术 平面设计,全国信息化计算机应用技术水平教育考试试卷 平面设计师...
  9. 支持回调处理 php函数,PHP支持回调的函数有哪些?
  10. Windows10家庭中文版没有本地策略选项完美解决方案