集成学习:Adaboost(原理篇)

前言

  • 本文参考众多技术文章,选取个人认为比较易于理解的例子以及数学公式原理来解读集成学习相关的一些算法原理,作为学习笔记。

  • 集成学习文章将会根据算法提出时间的顺序进行依次总结,最主要的是算法原理会越来越复杂,所以个人能力有限可能有些地方考虑不全面或者理解错了,所以总结文章仅供参考。

  • 每篇文章单独介绍时候会尽可能提出更多围绕本篇算法相关的问题,但是实际需要用到才会理解更深,所以不全面的地方还望提出问题,共同进步。

  • Adaboost原理还是较为简单易懂的,配合实例说明应该容易理解。

  • 本文只能理解Adaboost是怎么一个流程,是如何实现的,知道是怎么一回事的程度,具体如何实现可以看参考资料有的带实现代码,等Adaboost代码篇会更深入的解释该算法(应该是很久以后了)。

Adaboost篇

1 AdaBoost简介:

  • boosting,也被成为增强学习或者提升法,是一种重要的集成学习技术,能够将预测精度仅比随即猜测略高的弱学习器增强为预测精度高的强学习器,这在直接构造强学习器非常困难的情况下,为学习算法的设计提供了一种有效的新思路和新方法。

  • AdaBoost是英文"Adaptive Boosting"(自适应增强)的缩写,它的自适应在于:前一个基本分类器被错误分类的样本的权值会增大,而正确分类的样本的权值会减小,并再次用来训练下一个基本分类器。同时,在每一轮迭代中,加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数才确定最终的强分类器。

  • 注:弱分类器可以是不同种的分类器组合也可以是同种分类器组合

2 Adaboost算法三步实现:

  • 首先,是初始化训练数据的权值分布D1。假设有N个训练样本数据,则每一个训练样本最开始时,都被赋予相同的权值:w1=1/N。

  • 然后,训练弱分类器hi。具体训练过程中是:如果某个训练样本点,被弱分类器hi准确地分类,那么在构造下一个训练集中,它对应的权值要减小(分类错的后面迭代的时候重点训练);相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。

  • 最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。

  • 换而言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小

3 Adaboost算法过程:

  • daboost的目的就是从训练数据中学习一系列弱分类器或基本分类器,然后将这些弱分类器组合成一个强分类器。其中弱分类器不用一样,要的就是博采众长,组合成一个强分类器

  • 首先,初始化训练数据的权重值分布,每一个训练样本最开始时都是被赋予相同的权重值的,即Wi = 1 / N,这样训练样本集的初始权重值分布我们用Dt(i):(这里的t也可以代表迭代次数,D就是迭代t次的训练样本集的权重值分布
    D t ( i ) = ( w 1 , w 2 , . . . . , w N ) = ( 1 N , 1 N , . . . . , 1 N ) D_{t}(i) = (w_{1}, w_{2},....,w_{N}) = (\frac{1}{N}, \frac{1}{N}, .... ,\frac{1}{N}) Dt(i)=(w1,w2,....,wN)=(N1,N1,....,N1)

  • 开始迭代t = 1,… , T

  • 第一轮:选取一个当前误差率最低的弱分类器h作为第1个基本分类器H1,并根据弱分类器分类结果标签(如:1表示正,0表示负)计算弱分类器在第一轮训练集分布D1上的误差:
    e 1 = ∑ i = 1 n ( 分 错 样 本 的 权 重 值 ) (1) e_{1} = \sum_{i=1}^n(分错样本的权重值)\tag{1} e1=i=1n()(1)

  • (1)式为个人理解写出的伪公式,仅辅助理解,即误差的值就是H1基本分类器误分类样本的权重值的和

  • 计算该弱分类器在最终分类器中所占的权重(弱分类器的权重值用α表示)
    α 1 = 1 2 ln ⁡ 1 − e 1 e 1 (2) \alpha_{1} = \frac{1}{2}\ln{\frac{1-e_{1}}{e_{1}}}\tag{2} α1=21lne11e1(2)

  • 更新训练样本的权值分布D2:
    D 2 + 1 = D 1 2 ∗ ( 1 − e 1 ) (更新分类正确样本的权重值) D_{2}^{+1} = \frac{D1}{2*(1 - e_{1})}\tag{更新分类正确样本的权重值} D2+1=2(1e1)D1()
    D 2 − 1 = D 1 2 e 1 (更新分类错误样本的权重值) D_{2}^{-1} = \frac{D1}{2e_{1}}\tag{更新分类错误样本的权重值} D21=2e1D1()

  • 注1:上述更新权重值公式为化简后的结果,方便使用,原公式为:
    D t + 1 = D t ∗ exp ⁡ ( − α ∗ y i ∗ H t ) Z t (3) D_{t+1} = \frac{D_{t}*\exp(-\alpha*y_{i}*H_{t})}{Z_{t}}\tag{3} Dt+1=ZtDtexp(αyiHt)(3)
    Z t = 2 e t ∗ ( 1 − e t ) (3.1) Z_{t} = 2\sqrt{e_{t}*(1 - e_{t})}\tag{3.1} Zt=2et(1et) (3.1)

  • 注2:Zt为归一化常数,(3)中yi即表示分类器的结果,Ht是对应基本分类器的,化简时yi*Ht就是分类器实际分类后的结果(如分错的-1或者分对的+1)

  • 注3:从(3)式如何化简成单独的分错和分对的更新表达式,其实就是将注2中说的分类结果为-1或者+1带进去化简即可,此处不再详叙化简过程

  • 迭代一轮后,如果不再迭代,那么按照弱分类器的权重α组合各个弱分类器,即
    f ( x ) = ∑ t = 1 T α t H t (4) f(x) = \sum_{t=1}^T\alpha_{t}H_{t}\tag{4} f(x)=t=1TαtHt(4)

  • 最终通过符号函数sign的作用得到一个强分类器
    H f i n a l l y = s i g n ( f ( x ) ) = s i g n ( ∑ t = 1 T α t H t ) (5) H_{finally} = sign(f(x)) = sign(\sum_{t=1}^T\alpha_{t}H_{t})\tag{5} Hfinally=sign(f(x))=sign(t=1TαtHt)(5)

4 AdaBoost实例讲解

  • 例:给定如图所示的训练样本,弱分类器采用平行于坐标轴的直线,用Adaboost算法的实现强分类过程。图片

  • 将这10个样本作为训练数据,根据 X1与X2的对应关系,可把这10个数据分为两类,图中用“+”表示类别1,用“O”表示类别-1。本例使用水平或者垂直的直线作为分类器,图中已经给出了三个弱分类器(图只作为样例,并非三个分类器真实的分类结果),即
    h 1 = { 1 , X 1 < 2.5 − 1 , X 1 > 2.5 (h1) h_{1}=\begin{cases} 1,X_{1} < 2.5 \\ -1, X_{1} > 2.5\end{cases}\tag{h1} h1={1X1<2.51X1>2.5(h1)

h 2 = { 1 , X 1 < 8.5 − 1 X 1 > 8.5 (h2) h2 = \begin{cases} 1,X_{1} < 8.5 \\ -1 X_{1} > 8.5\end{cases}\tag{h2} h2={1,X1<8.51X1>8.5(h2)

h 3 = { 1 , X 2 > 6.5 − 1 X 2 < 6.5 (h2) h3 = \begin{cases} 1,X_{2} > 6.5 \\ -1 X_{2} < 6.5\end{cases}\tag{h2} h3={1,X2>6.51X2<6.5(h2)

  • 首先需要初始化训练样本数据的权值分布,每一个训练样本最开始时都被赋予相同的权值:wi=1/N,这样训练样本集的初始权值分布_D_1(i):令每个权值_w_1_i_ = 1/N = 0.1,其中,N = 10,i = 1,2, …, 10,然后分别对于_t_= 1,2,3, …等值进行迭代(_t_表示迭代次数,表示第_t_轮),下表已经给出训练样本的权值分布情况:图片

  • 第1次迭代t=1:
  • 初试的权值分布_D1_为1/N(10个数据,每个数据的权值皆初始化为0.1)

  • D1=[0.1, 0.1, 0.1, 0.1, 0.1, 0.1,0.1, 0.1, 0.1, 0.1]

  • 在权值分布_D1_的情况下,取已知的三个弱分类器_h_1、_h_2和_h_3中误差率最小的分类器作为第1个基本分类器_H_1(x)(三个弱分类器的误差率都是0.3(即分错样本的权重之和),那就取第1个吧),即用公式(h1)

  • 在分类器_H_1(x)=_h_1情况下,样本点“5 7 8”被错分,因此基本分类器_H_1(x)的误差率为:(比对例图)

  • 那么根据公式(1)计算e1
    e 1 = 0.1 + 0.1 + 0.1 = 0.3 e_{1} = 0.1 + 0.1 + 0.1 = 0.3 e1=0.1+0.1+0.1=0.3

  • 根据公式(2)计算弱分类器的权重值(即这个α1代表的H1分类器在最终的分类函数中所占比重为0.4236)
    α 1 = 1 2 ln ⁡ 1 − 0.3 0.3 = 0.4236 \alpha_{1} = \frac{1}{2}\ln{\frac{1-0.3}{0.3}} = 0.4236 α1=21ln0.310.3=0.4236

  • 可见,被误分类样本的权值之和影响误差率_e_,误差率_e_影响基本分类器在最终分类器中所占的权重_α_图片

  • 然后,根据公式(3)更新训练样本数据的权值分布,用于下一轮迭代

  • 对于正确分类的训练样本“1 2 3 4 6 9 10”(共7个)的权值更新为:**显然分类正确的样本权重降低了
    D 2 = D 1 2 ∗ ( 1 − e 1 ) = 1 14 D_{2} = \frac{D1}{2*(1 - e_{1})} = \frac{1}{14} D2=2(1e1)D1=141

  • 对于错误分类的训练样本“5 7 8”(共3个)的权值更新为:显然分类错误的样本权重升高了
    D 2 = D 1 2 ∗ e 1 = 1 6 D_{2} = \frac{D1}{2*e_{1}} = \frac{1}{6} D2=2e1D1=61

  • 这样,第1轮迭代后,最后得到各个样本数据新的权值分布:

  • D2=[1/14,1/14,1/14,1/14,1/6,1/14,1/6,1/6,1/14,1/14]

  • 由于样本数据“5 7 8”被_H_1(x)分错了,所以它们的权值由之前的0.1增大到1/6;反之,其它数据皆被分正确,所以它们的权值皆由之前的0.1减小到1/14,下表给出了权值分布的变换情况:图片

  • 可得分类函数:f_1(_x)= α_1_H_1(x) = 0.4236_H_1(x)。此时,组合一个基本分类器_sign(f1(x))作为强分类器在训练数据集上有3个误分类点(即5 7 8),此时强分类器的训练错误为:0.3

  • 第二次迭代*t*=2

  • 在权值分布D2的情况下,再取三个弱分类器h1、h2和h3中误差率最小的分类器作为第2个基本分类器H2(x):

    ① 当取弱分类器h1=X1=2.5时,此时被错分的样本点为“5 7 8”:

    误差率e=1/6+1/6+1/6=3/6=1/2;

    ② 当取弱分类器h2=X1=8.5时,此时被错分的样本点为“3 4 6”:

    误差率e=1/14+1/14+1/14=3/14;

    ③ 当取弱分类器h3=X2=6.5时,此时被错分的样本点为“1 2 9”:

    误差率e=1/14+1/14+1/14=3/14;

  • 显然误差率当前最小的分类器h2作为第2个基本分类器

  • 显然,_H_2(x)把样本“3 4 6”分错了,根据_D_2可知它们的权值为_D_2(3)=1/14,_D_2(4)=1/14, _D_2(6)=1/14,所以_H_2(x)在训练数据集上的误差率:

  • 同样的方法计算e2,alpha2,以及更新后的D3

  • 这样,第2轮迭代后,最后得到各个样本数据新的权值分布:

    D3=[1/22,1/22,1/6,1/6,7/66,1/6,7/66,7/66,1/22,1/22]图片

  • 可得**分类函数:__f_2(x)=0.4236_H_1(x) + 0.6496_H_2(x)。此时,组合两个基本分类器_sign(_f_2(x))作为强分类器在训练数据集上有3个误分类点(即3 4 6),此时强分类器的训练错误为:0.3

  • 同理迭代第三次,得到各个样本数据新的权值分布为:

    D4=[1/6,1/6,11/114,11/114,7/114,11/114,7/114,7/114,1/6,1/38]图片

  • 可得**分类函数:__f_3(x)=0.4236_H_1(x) + 0.6496_H_2(x)+0.9229_H_3(x)。此时,组合三个基本分类器_sign(_f_3(x))作为强分类器,在训练数据集上有0个误分类点。至此,整个训练过程结束。

  • 整合所有分类器,可得最终的强分类器为:
    H f i n a l l y = s i g n ( f ( x ) ) = s i g n ( ∑ t = 1 T α t H t ) H_{finally} = sign(f(x)) = sign(\sum_{t=1}^T\alpha_{t}H_{t}) Hfinally=sign(f(x))=sign(t=1TαtHt)

5 Adaboost损失函数

  • AdaBoost算法可以认为是一种模型为加法模型、损失函数为指数函数、学习算法为前向分步算法的二分类学习方法

  • 具体加法算法,前向分步算法此处暂不做详解(参考资料中有关于为何Adaboost不会过拟合以及损失函数的求解等解答,公式过多,个人数学能力有限,想看详情可以自己去看)

6 Adaboost的优缺点

  • Adaboost提供一种框架,在框架内可以使用各种方法构建子分类器。可以使用简单的弱分类器,不用对特征进行筛选,也不存在过拟合的现象。(原因见参考资料中博客)

  • Adaboost算法不需要弱分类器的先验知识,最后得到的强分类器的分类精度依赖于所有弱分类器。无论是应用于人造数据还是真实数据,Adaboost都能显著的提高学习精度。

  • Adaboost算法不需要预先知道弱分类器的错误率上限,且最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度,可以深挖分类器的能力。Adaboost可以根据弱分类器的反馈,自适应地调整假定的错误率,执行的效率高。

  • Adaboost对同一个训练样本集训练不同的弱分类器,按照一定的方法把这些弱分类器集合起来,构造一个分类能力很强的强分类器,即“三个臭皮匠赛过一个诸葛亮”。

  • 在Adaboost训练过程中,Adaboost会使得难于分类样本的权值呈指数增长,训练将会过于偏向这类困难的样本,导致Adaboost算法易受噪声干扰。此外,Adaboost依赖于弱分类器,而弱分类器的训练时间往往很长。

7 Adaboost参考资料

  • 包含另一个比较容易理解的实例以及简单对求解损失函数的一个叙述 https://www.cnblogs.com/willnote/p/6801496.html

  • 本文主要参考文章(不同之处在于梳理了原理公式部分的一些理解,举的实例还是该文章比较全,虽然也是转发的)
    https://zhuanlan.zhihu.com/p/41536315

  • 可能本文例子最原始的出处以及代码(其中代码本人未实践) https://blog.csdn.net/guyuealian/article/details/70995333

  • 最全的算法原理推导以及损失函数求解(看的七七八八八不太懂,太高深了)
    https://blog.csdn.net/v_july_v/article/details/40718799

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

矮人三等

秀儿,是你吗秀儿?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值