组合分类器是一个复合模型,由多个分类器组合而成,个体分类器投票,组合分类器基于投票返回的标号预测,因此组合分类器通常比他的成员分类器更准确,通常组合分类器包含袋装、提升和随机深林,本节将主要讲解Adaboost算法,袋装很简单,大家可以自行百度。
下面先从感性方面认识一下Adaboost(Adaptive Boosting 自适应提升)算法,然后先举一个简单的例子,再然后从数学方面分析该算法为什么会有如此高的准确率,最后通过代码实现该算法。
假如你是一位患者,有某些症状,你选择咨询多位医生而不是一位,假设你根据先前的诊断准确率,对每位医生的诊断的诊断赋予一个权重,然后这些加权诊断组合作为最终的诊断,这就是组合分类的思想。 现在我们有很多分类器,只是每个分类的分类准确率都不高,但是必须要大于随机的准确率,这是必要条件。这时我想一个办法就是把这些准确率不高的分类器组合起来,使其分类准确率提高,根据组合起来的分类器返回的分类结果进行表决,分类结果为表决结果多的一类,就是这个思想,只是实际的组合分类器他有更好的组合方法,例如Adaboost就是基于指数损失函数进行优化的组合分类器。
首先强调的是组合方式目前最常用的是两种组合方式:
Boosting:个体学习器间存在强依赖关系,必须串行生成。
Bagging,随机森林:个体之间不存在强依赖关系,可并行生成。
先给出Adaboost分类器的组合决策函数:
其中 为第i个子分类器的系数, 为第i个子分类器。
什么是Adaboost算法呢?简单来说就是一个多人投票表决的算法,在这里需要强调的是boosting的子分类器必须串行,即训练是一个一个来的,只有当前子分类器训练结束以后下一个分类器才开始训练(切记这一点),只是这里不一样的是为了提高分类准确率他是从两方面进行优化,即数据和子分类器,在这里需要强调一下,这是容易搞混的地方。首先是多个分类器,然后是固定数量的样本数据集合D即,对于训练每一个分类器时,都会出现分类错误的样本,此时更新样本参与训练数据的权值,分错的数据权值(概率)加大(目的是下一次分类会优先选择本次分类错误的数据),而分类正确的数据权值不变,所以后面的子分类器是针对前面分类错的数据进行重点关注,对每一个串行的子分类器的数据选择原则就是根据数据的权值(或者说是概率)进行选择分类器,训练数据就是这样选择的。下面在讲一下子分类器的权值更新,分类器是串行的,当通过本次的训练数据进行训练时,得到本次的错误率,Adaboost的子分类器权值更新的目的是如果该子分类器错误类很高,那么这个子分类器的权值就会降低,如上式的,如果该分类器的错误率很低,那么他的权值相应很高,在决策时起到关键的作用,这两个点希望大家多留意一下,下面先给出算法的伪代码,简单的解释一下,可能大家会有很多疑惑,别急后面都会通过数学给出合理的解释,现在的目的就是希望大家先从整体的把握这个算法,理解他的更新过程,只有这样才能理解后面的数学,可能大家会说为什么不先理解数学在实现呢?因为这个算法有点特殊,他有两个地方优化,直接从数学方面讲,大家晕的,好废话不多说,先给算法伪代码:
这里先解释一下几个名词:
基学习算法:是指上面提到的子分类器如决策树、
训练轮数: 是指子分类器的个数,因为每一轮就属于完成一个子分类器的训练
简单的解释一下:
-
第 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 行,计算当前分类器的误差,解释一下这个公式,这是一个概率,其中是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个学习器进行加权组合。
首先我们假设给定一个二分类的训练数据集:
其中 , 。
初始化样本的权重为:
第m个基分类器的样本权重为(这时候大家要明确这是第m个子分类器):
我们构建M个基学习器,最终的学习器即为基学习器的线性组合:
其中 为第i个基学习器的系数, 为第i个基学习器。
接下来我们定义 在训练集合中的分类误差率(就是在训练第m个子分类器时分错的占比)为:
也就是说 在加权训练数据集中的分类误差率为被误分类的样本权值之和。注意一下,我们定义的基学习器,其 ,感觉还是不清晰还是直接给出解释
这里的损失函数定义为指数损失函数,为什么选择指数损失函数呢? 这个需要综合考虑,分析完在解释一下。
接着我们定义损失函数为指数损失函数:
其中y是样本的实际类别,f(x)是预测的类别,样本x的权重服从D分布。E代表求期望。大家还记的求求期望是如何求的吧?
为了下面式子理解的更顺畅我继续往下写,即:
上式大家能理解吗?首先你需要知道概率论中的求期望的定义其实就是值乘以概率即:
这样大家就能理解下面的式子了。
损失函数为什么这样定义?
下面一起证明一下:
若f(x)能使损失函数最小化,那我们考虑上式对f(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
这样的分类规则正是我们所需要的,若指数函数最小化,则分类错误率也最小,它们俩是一致的。所以我们的损失函数可以这样定义。
好, 到这里需要总结一下,上面是通过数据的权值去体现子分类器的错误率,此时就把错误率和数据的权值联系起来了,同时为了能体现衡量分类器的好坏,我们从分类结果出发,根据组合分类器的分类结果和实际结果乘积在通过指数函数表达,求其均值,使其指数函数的均值达到最小为优化目标,即指数损失函数。
定义完了损失函数,我们看怎么来进行子分类器 和系数 的求取。
第一个分类器G1(x)是直接将基学习算法用于初始数据分布求得,之后不断迭代,生成 和 。当第m个基分类器产生后,我们应该使得其在数据集第m轮样本权重基础上的指数损失最小,计算和上面差不多,不一样的是这里组合分类器函数f(x)拆成子分类器的形式,原理还是一样的,即
首先,我们求解 ,对任意的 ,最优的 应为:
其中 是第m轮训练样本的权重。 就是在第m轮中使得加权训练样本误差率最小的分类器。
在得到 后,我们来求 。 应该使得损失函数最小,所以令下式对 求导等于零:
得到 的表达式:
由于 ,所以 ,且 随着 的减小而增大。如下图
这时候我们就可以得到Adaboost的迭代公式:
上式我觉的还是比较简单的,子分类器的训练是串联的即每一次只训练一个分类器,因此更新就是上式了。
这时候就只剩下最后一个问题,之前说,我们会根据基学习器的表现对训练样本的权重进行调整,使得先前基学习器做错的样本在后续得到更多的关注。那训练样本的权重分布 应该怎么变化呢?
这一部分在周志华老师《机器学习》P175有详细的推导,感兴趣的读者可以自行查阅。我这里直接给出 的迭代公式,并证明其可行性。
其中 ,是一个常数。
上面就是样本权重 的迭代公式。我们发现:
当 时:
当 时:
由于 ,从上面的式子可以看到,当样本i上一次被误分类时,其下一次的权重 会变大;而当样本i上一次被分类正确时,其下一次的权重 会变小。因此,误分类样本在下一轮学习中起到的作用更大,这也是Adaboost的一个特点。如下图当分类正确时是黄色线,分类错误时是蓝色线
上面就是全部的理论了,下一节给出机器学习实战的代码。
主要参考了以下文章:
李航的统计学习方法