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

版权声明:转载请注明出处: https://blog.csdn.net/weixin_42398658/article/details/83410681

组合分类器是一个复合模型,由多个分类器组合而成,个体分类器投票,组合分类器基于投票返回的标号预测,因此组合分类器通常比他的成员分类器更准确,通常组合分类器包含袋装、提升和随机深林,本节将主要讲解Adaboost算法,袋装很简单,大家可以自行百度。

     下面先从感性方面认识一下Adaboost(Adaptive Boosting 自适应提升)算法,然后先举一个简单的例子,再然后从数学方面分析该算法为什么会有如此高的准确率,最后通过代码实现该算法。

     假如你是一位患者,有某些症状,你选择咨询多位医生而不是一位,假设你根据先前的诊断准确率,对每位医生的诊断的诊断赋予一个权重,然后这些加权诊断组合作为最终的诊断,这就是组合分类的思想。 现在我们有很多分类器,只是每个分类的分类准确率都不高,但是必须要大于随机的准确率,这是必要条件。这时我想一个办法就是把这些准确率不高的分类器组合起来,使其分类准确率提高,根据组合起来的分类器返回的分类结果进行表决,分类结果为表决结果多的一类,就是这个思想,只是实际的组合分类器他有更好的组合方法,例如Adaboost就是基于指数损失函数进行优化的组合分类器。

       首先强调的是组合方式目前最常用的是两种组合方式:

      Boosting:个体学习器间存在强依赖关系,必须串行生成。
      Bagging,随机森林:个体之间不存在强依赖关系,可并行生成。

先给出Adaboost分类器的组合决策函数:

f(x)=\sum_{i=1}^{M}{\alpha_{i}G_{i}(x)}

 其中 \alpha_{i} 为第i个子分类器的系数, G_{i}(x) 为第i个子分类器。 

     什么是Adaboost算法呢?简单来说就是一个多人投票表决的算法,在这里需要强调的是boosting的子分类器必须串行,即训练是一个一个来的,只有当前子分类器训练结束以后下一个分类器才开始训练(切记这一点),只是这里不一样的是为了提高分类准确率他是从两方面进行优化,即数据和子分类器,在这里需要强调一下,这是容易搞混的地方。首先是多个分类器,然后是固定数量的样本数据集合D即(x_{i},y_{i})),对于训练每一个分类器时,都会出现分类错误的样本,此时更新样本参与训练数据的权值,分错的数据权值(概率)加大(目的是下一次分类会优先选择本次分类错误的数据),而分类正确的数据权值不变,所以后面的子分类器是针对前面分类错的数据进行重点关注,对每一个串行的子分类器的数据选择原则就是根据数据的权值(或者说是概率)进行选择分类器,训练数据就是这样选择的。下面在讲一下子分类器的权值更新,分类器是串行的,当通过本次的训练数据进行训练时,得到本次的错误率,Adaboost的子分类器权值更新的目的是如果该子分类器错误类很高,那么这个子分类器的权值就会降低,如上式的\alpha_{i},如果该分类器的错误率很低,那么他的权值相应很高,在决策时起到关键的作用,这两个点希望大家多留意一下,下面先给出算法的伪代码,简单的解释一下,可能大家会有很多疑惑,别急后面都会通过数学给出合理的解释,现在的目的就是希望大家先从整体的把握这个算法,理解他的更新过程,只有这样才能理解后面的数学,可能大家会说为什么不先理解数学在实现呢?因为这个算法有点特殊,他有两个地方优化,直接从数学方面讲,大家晕的,好废话不多说,先给算法伪代码:

 这里先解释一下几个名词:

基学习算法:是指上面提到的子分类器如决策树、

训练轮数: 是指子分类器的个数,因为每一轮就属于完成一个子分类器的训练

简单的解释一下:

  • 第 1 行,初始化样本权重分布,此时每个数据的权重是一样的,所以是 1/m;
    以分类问题为例,最初令每个样本的权重都相等,对于第 t 次迭代操作,我们就根据这些权重来选取样本点,进而训练子分类器 C_t

  • 第 2 行,进入 for 循环 T 次,即基学习器的个数为 T 个;

  • 第 3 行,根据具有当前权重分布 D_t 的数据集,学习出 h_t,其实就是分类结果
    前一个分类器分错的样本会被用来训练下一个分类器。
    h_t 是分量分类器 C_t 给出的对任一样本点 xi 的标记(+1或-1),h_t(xi) = yi 时,样本被正确分类。

  • 第 4 行,计算当前分类器的误差,解释一下这个公式\epsilon _{t} = P_{x\sim D_{t}}(h_{t}(x) \neq f(x)),这是一个概率,其中x\sim D_{t}是x服从Dt分布的意思,这在权值更新时用到,大家要留意一下。

  • 第 5 行,如果误差大于 0.5,就停止;
    AdaBoost 方法中使用的分类器可能很弱(比如出现很大错误率),但只要它的分类效果比随机好一点(比如两类问题分类错误率略小于0.5),就能够改善最终得到的模型。

  • 第 6 行,计算当前学习器的权重 α_t;为什么是这个表达式,后面数学推倒会详细给出过程
    权值是关于误差的表达式,当下一次分类器再次错分这些点之后,会提高整体的错误率,这样就导致分类器权值变小,进而导致这个分类器在最终的混合分类器中的权值变小,也就是说,Adaboost算法让正确率高的分类器占整体的权值更高,让正确率低的分类器权值更低,从而提高最终分类器的正确率。

  • 第 7 行,得到下一时刻的权重分布 D_t+1.
    如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它被选中的概率就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。通过这样的方式,AdaBoost 方法能“聚焦于”那些较难分(更富信息)的样本上。

最后的总体分类的判决可以使用各个分量分类器加权平均来得到,
再取符号,这样,最后对分类结果的判定规则是:

下面在给出一个小例子:

图中“+”和“-”表示两种类别,
共10个样本,故每个样本权值为0.1,

第一次划分有3个点划分错误,根据误差表达式得到误差:e1=(0.1+0.1+0.1)/1.0=0.3

分类器权重:

根据算法,对于正确分类的7个点,权值不变,仍为0.1, 对于错分的3个点,权值为:
D1=D0*(1-e1)/e1=0.1*(1-0.3)/0.3=0.2333

第二次分类,有3个 "-" 分类错误,按照算法计算如下:
上轮分类后权值之和为:0.17+0.23333=1.3990
分类误差:e2=0.1*3/1.3990=0.2144
分类器权重 a2=0.6493
错分的3个点权值为:D2=0.1*(1-0.2144)/0.2144=0.3664

第三次:

同上步骤可求得:e3=0.1365 ;a3=0.9223;D3=0.6326 

最后将三次的分类器结合起来,得到下面的分类结果:

大家可以发现单个分类器的性能并不是很好,但是组合起来的分类器效果就很好了。


到这里大家对adaboost的整体应该有一个清晰的认识了,下面就是介绍为什么会是这样,为什么数据权值和子分类器权值的更新是这样更新的,有什么依据?下面将给出数学方面的推倒,在看下面之前,请确认自己是否对adaboost有了整体的理解,并指导权值是如何更新的,好,下面开始理论说明:

Adaboost算法:先从初始训练集合中训练出一个基学习器,再根据基学习器的表现对训练样本的权重进行调整,使得先前基学习器做错的样本在后续得到更多的关注,然后基于调整后的样本权重来训练下一个基学习器,直到基学习器的数目达到事先指定的数目M,最终将这M个学习器进行加权组合。

首先我们假设给定一个二分类的训练数据集:

T=\left\{ (x_{1},y_{1}), (x_{2},y_{2}),... (x_{N},y_{N})\right\}

                                                                 其中 x\in R^{n} , y\in \left\{ -1,+1 \right\} 。

初始化样本的权重为:

D_{1}=\left\{ w_{11},w_{12},...w_{1N} \right\},w_{1i}=\frac{1}{N}

第m个基分类器的样本权重为(这时候大家要明确这是第m个子分类器):

                                                                D_{m}=\left\{ w_{m1},w_{m2},...w_{mN} \right\},\sum_{i=1}^{N}{w_{mi}=1}

我们构建M个基学习器,最终的学习器即为基学习器的线性组合:

f(x)=\sum_{i=1}^{M}{\alpha_{i}G_{i}(x)}

其中 \alpha_{i} 为第i个基学习器的系数, G_{i}(x) 为第i个基学习器。

接下来我们定义 G_m(x) 在训练集合中的分类误差率(就是在训练第m个子分类器时分错的占比)为:

e_m=\sum_{i=1}^{N}{P(G_m(x_i)\ne y_i)}=\sum_{i=1}^{N}{w_{mi}I(G_m(x_i) \ne y_i)}

也就是说 G_m(x) 在加权训练数据集中的分类误差率为被误分类的样本权值之和。注意一下,我们定义的基学习器,其 e_m<0.5 ,感觉还是不清晰还是直接给出解释

这里的损失函数定义为指数损失函数,为什么选择指数损失函数呢? 这个需要综合考虑,分析完在解释一下。

接着我们定义损失函数为指数损失函数:

                                                    L(y,f(x))=E_{x\sim D}\left[ e^{(-yf(x)) }\right]

其中y是样本的实际类别,f(x)是预测的类别,样本x的权重服从D分布。E代表求期望。大家还记的求求期望是如何求的吧?

为了下面式子理解的更顺畅我继续往下写,即:

                                                    L(y,f(x)) = E_{x\sim D}\left[ e^{(-yf(x))} \right]=e^{-f(x)}P(y=1|x)+e^{f(x)}P(y=-1|x)

上式大家能理解吗?首先你需要知道概率论中的求期望的定义其实就是值乘以概率即:

                                                      E(x) = \sum_{k=0}^{\infty }x_{k}p(k) 

这样大家就能理解下面的式子了。 

损失函数为什么这样定义?

下面一起证明一下:

若f(x)能使损失函数最小化,那我们考虑上式对f(x)的偏导为零:

                                                        \frac{\partial L(y,f(x))}{\partial f(x)}=-e^{-f(x)}P(y=1|x)+e^{f(x)}P(y=-1|x)

令上式为零,得:

f(x)=\frac{1}{2}ln\frac{P(y=1|x)}{P(y=-1|x)}

因此,有

sign(f(x))=sign(\frac{1}{2}ln\frac{P(y=1|x)}{P(y=-1|x)})

大家对数都没忘吧?忘了的百度一下。

当P(y=1|x)>P(y=-1|x)时,sign(f(x))=1

当P(y=1|x)>P(y=-1|x)时,sign(f(x))=-1

这样的分类规则正是我们所需要的,若指数函数最小化,则分类错误率也最小,它们俩是一致的。所以我们的损失函数可以这样定义。

好, 到这里需要总结一下,上面是通过数据的权值去体现子分类器的错误率,此时就把错误率和数据的权值联系起来了,同时为了能体现衡量分类器的好坏,我们从分类结果出发,根据组合分类器的分类结果和实际结果乘积在通过指数函数表达,求其均值,使其指数函数的均值达到最小为优化目标,即指数损失函数。

定义完了损失函数,我们看怎么来进行子分类器 G_m(x) 和系数 \alpha_{i} 的求取。

第一个分类器G1(x)是直接将基学习算法用于初始数据分布求得,之后不断迭代,生成 \alpha_m 和 G_m 。当第m个基分类器产生后,我们应该使得其在数据集第m轮样本权重基础上的指数损失最小,计算和上面差不多,不一样的是这里组合分类器函数f(x)拆成子分类器的形式,原理还是一样的,即

                             L(\alpha_m,G_m(x))=argmin E_{x\sim D_m}\left[ {exp(-y\alpha_mG_m(x))} \right]

                                                          =E_{x\sim D_m}\left[ \sum_{y_i=G_m(x_i)}{e^{-\alpha_m}}+\sum_{y_i\ne G_m(x_i)}{e^{\alpha_m}} \right]

                                                           =e^{-\alpha_m}P(y_i=G_m(x_i))+e^{\alpha_m}P(y_i\ne G_m(x_i))

                                                           =e^{-\alpha_m}(1-e_m)+e^{\alpha_m}e_m

首先,我们求解 G_m(x) ,对任意的 \alpha>0 ,最优的 G_m(x) 应为:

G_{m}(x)=argmin\sum_{i=1}^{N}{{w}_{mi}I(y_i\ne G_m(x_i))}

其中w_{mi} 是第m轮训练样本的权重。G_m(x) 就是在第m轮中使得加权训练样本误差率最小的分类器。

在得到 G_m(x) 后,我们来求 \alpha_m 。 \alpha_m应该使得损失函数最小,所以令下式对 \alpha_m 求导等于零:

                                                          \frac{\partial L(\alpha_m,G_m(x))}{\partial \alpha_m}=-e^{-\alpha_{m}}(1-e_m)+e^{\alpha_{m}}e_m=0

得到 \alpha_m 的表达式:

\alpha_m=\frac{1}{2}ln(\frac{1-e_m}{e_m})

由于 e_m<0.5,所以 \alpha_m>0 ,且 \alpha_m 随着 e_m 的减小而增大。如下图

这时候我们就可以得到Adaboost的迭代公式: 

f_{m}(x)=f_{m-1}(x)+\alpha_{m}G_{m}(x)

上式我觉的还是比较简单的,子分类器的训练是串联的即每一次只训练一个分类器,因此更新就是上式了。

这时候就只剩下最后一个问题,之前说,我们会根据基学习器的表现对训练样本的权重进行调整,使得先前基学习器做错的样本在后续得到更多的关注。那训练样本的权重分布 D_m 应该怎么变化呢?

这一部分在周志华老师《机器学习》P175有详细的推导,感兴趣的读者可以自行查阅。我这里直接给出 D_m 的迭代公式,并证明其可行性。

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

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

w_{m+1,i}=\frac{w_{mi}exp(-\alpha_my_iG_m(x_i))}{Z_m}

                                      其中 Z_m=\sum_{i=1}^{N}{w_{mi}exp(-\alpha_my_iG_m(x_i))} ,是一个常数。

上面就是样本权重 D_m 的迭代公式。我们发现:

当 G_m(x_i)= y_i 时:

                                                                         w_{m+1,i}=\frac{w_{mi}}{Z_m}e^{-\alpha_m}

当 G_m(x_i)\ne y_i 时:

                                                                        w_{m+1,i}=\frac{w_{mi}}{Z_m}e^{\alpha_m}

由于 \alpha_m>0 ,从上面的式子可以看到,当样本i上一次被误分类时,其下一次的权重 w_{m+1,i}会变大;而当样本i上一次被分类正确时,其下一次的权重 w_{m+1,i} 会变小。因此,误分类样本在下一轮学习中起到的作用更大,这也是Adaboost的一个特点。如下图当分类正确时是黄色线,分类错误时是蓝色线

 上面就是全部的理论了,下一节给出机器学习实战的代码。

主要参考了以下文章:

李航的统计学习方法

https://www.jianshu.com/p/389d28f853c0

猜你喜欢

转载自blog.csdn.net/weixin_42398658/article/details/83410681
今日推荐