🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题
🍊专栏推荐:深度学习网络原理与实战
🍊近期目标:写好专栏的每一篇文章
🍊支持小苏:点赞👍🏼、收藏⭐、留言📩
写在前面
Hello,大家好,我是小苏🧒🏽🧒🏽🧒🏽
今天要为大家带来一种常见的机器学习算法————Adaboost,同样也是非常常见的一种集成学习方法。🌸🌸🌸本文将从Adaboost的原理入手,和大家详细唠唠Adaboost的原理,然后会通过一个小案例来帮助大家更深入的理解Adaboost算法。希望大家能通过本文对Adaboost算法有更深入的了解,有不明白的地方也欢迎大家评论区讨论交流喔~~~🌼🌼🌼
1. Adaboost 算法简介🌴🌴🌴
AdaBoost 是英文"Adaptive Boosting"(自适应增强)的缩写, 它的自适应在于: 前一个 基本分类器被错误分类的样本的权值会增大, 而正确分类的样本的权值会减小, 并再次用来 训练下一个基本分类器。同时, 在每一轮迭代中, 加入一个新的弱分类器, 直到达到某个预 定的足够小的错误率或达到预先指定的最大迭代次数才确定最终的强分类器。
读到这里, 大概率是不理解什么是 AdaBoost 算法的, 不用急, 后面会介绍 Adaboost 的 算法流程以及用一个例子来深入理解这个算法。🍓🍓🍓
2. Adaboost 算法流程🌴🌴🌴
Adaboost 算法流程主要是以下三步:
Step1:
首先初始化训练数据的权值分布。如果有 N 个样本, 则每一个训练样本最开始时都 被赋予相同的权值: 1 / N 。
Step2:
其次训练弱分类器。具体训练过程中, 如果某个样本点已经被准确地分类, 那么在 构造下一个训练集中, 它的权值就被降低; 相反, 如果某个样本点没有被准确地分类, 那么 它的权值就得到提高。然后, 权值更新过的样本集被用于训练下一个分类器, 整个训练过程 如此迭代地进行下去。
Step3:
最后将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后, 加大分类误差率小的弱分类器的权重, 使其在最终的分类函数中起着较大的决定作用, 而降 低分类误差率大的弱分类器的权重, 使其在最终的分类函数中起着较小的决定作用。换言之, 误差率低的弱分类器在最终分类器中占的权重较大, 否则较小。
接下来我们按照上述三步对算法流程进行一个具体的阐述。首先给定一个训练数据集T={(x1,y1),(x2,y2)⋯(xN,yN)} , yi 属于标记集合 {-1,+1} , Adaboost 的目的就是从训练数据中学 习一系列弱分类器或基本分类器, 然后将这些弱分类器组合成一个强分类器。
Step1:
首先, 初始化训练数据的权值分布。每一个训练样本最开始都被赋予了相同的权值: 1/N。 D1(i) 表示训练样本集的初始权值分布。 ω1i 表示第一次迭代的第 i 个权值。
D1(i)=(ω11,ω12,⋯ω1i,⋯,ω1N),ω1i=N1,i=1,2,⋯N
Step2:
进行多轮迭代, 用 m=1,2,…,M 表示迭代的第多少轮。
(a) 选取一个当前误差率最低的弱分类器 G 作为第 m 个基本分类器 G_{m} , 并计算弱分类 器 Gm:X →{−1,1} 在分布 Dm 上的误差, 其误差为: 【注: 误差应小于 0.5 】
em=P(Gm(xi)=yi))=∑i=1NωmiI(Gm(xi)=yi)
由上述式子可知, Gm(x) 在训练数据集上的误差率 em 就是被 Gm(x) 误分类样本的权值之和。
(b) 计算弱分类器在最终分类器中所占权重, 用 am 表示其权重:
am=21In(em1−em)
对于上述式子, 我们可以看出, 当 em=21 时, am=0 。当 em 越大, am 越小。这就表示 am 随着 em 的减小而增大, 意味着分类误差率越小的基本分类器在最终分类器中的作用越大。
(c) 更新训练样本权重 Dm+1 , 用于下一次迭代。首先我们要明白调整权重值的规则, 即 对上一次分对的样本权重降低, 对上一次分错的样本权重增加。
则如果第 i 个样本被正确分类, 则该样本的权重更改为:
ωm+1,i=Zmωm,ie−a
如果第 i 个样本被错误分类, 则该样本的权重更改为:
ωm+1,i=Zmωm,iea
将两个公式整合可用一个公式表示:
ωm+1,i=Zmωmiexp(−amyiGm(xi)),i=1,2,⋯,N
对上式整合结果进行解释如下: 当样本分对时, yiGm(xi)=1 ; 当样本分错时, yi Gm(xi)=−1 。 最终整个第 m+1 次迭代的权值为:
Dm+1=(ωm+1,1,ωm+1,2,⋯ωm+1,i,⋯,ωm+1,N)
其中 Zm=∑i=1Nωmiexp(−amyiGm(xi))=2em(1−em),Zm 是规范化因子, 使得 ωm+1 成为 一个概率分布。对于 Zm=2em(1−em) 的推导过程如下:
Zm=i=1∑Nωmiexp(−amyiGm(xi))=i:Gm(xi=yi∑ωmieat+i:Gm(xi)=yi∑ωmie−at=emeat+(1−em)e−at−−(1)=2em(1−em)−−(2)
对于上面推导过程 (1) (2) 做出相关解释。
(1)
首先要理解 em 的含义: 其表示误差率, 而其在数值上是等于误分类样本的权值之和。 (上文提到) 那么 ∑i:Gm(xi)=yiωmi 表示的就是误分类样本的权值之和, 所以 ∑i:Gm(xi)=yiωmi 就 等于 em , 从而 ∑i:Gm(xi)=yiωmi 的值就等于 (1−em)
(2)
am=21In(em1−em), 将其带入上式即可。
Step3:
按照分类器权值 am 组合各个若弱分类器:
f(x)=∑m=1MamGm(x)
最后通过 sign 函数, 得到一个最终的强分类器:
G(x)=sign(f(x))=sign(∑m=1MamGm(x))
其中 sign(f(x)) 函数表示当 f(x)>0 时, sign(f(x))=1 ; 当 f(x)<0 时, sign(f(x))=−1 。
3. Adaboost 案例演示🌴🌴🌴
通过对上面算法流程的概述, 或许你对 Adaboost 已经有了一些了解, 但更多的可能还 是存有疑惑, 下面通过一个经典的例子来加深对这个算法的理解。读者可以尝试从算法流程 去解答这个例子, 也可以从例子中去理解算法中的一些公式的表达。
例子如下: 首先给出如下图所示的训练样本, 用 Adaboost 算法学习一个强分类器。
拿到这组数据, 我们先对其做一个直观上的分析。可以看出, 图中共有 10 组对应的 X-Y 数 据。根据 X 和 Y 的关系, 可以把这 10 个数据分成 2 类, 一类是 “ 1 ”, 一类是 “-1”, 根据数 据的特点发现: “0 12 ” 这 3 个数据对应的类是 “1”, “3 45 ” 这 3 个数据对应的类是 “-1”, “678” 这 3 个数据对应的类是 “1”, 9 是比较孤独的, 对应类 “-1”。抛开孤独的 9 不讲, “0 12”、 “3 5”、“678” 这是 3 类不同的数据, 分别对应的类是 1、-1、1, 直观上推测可 知, 可以找到对应的数据分界点, 比如 2.5、5.5、8.5 将那几类数据分成两类。当然, 这只 是主观臆测, 需要进行实际的计算。接下来我们将通过算法流程中的三步进行求解。
Step1:
初始化训练数据的权值分布, 所给训练样本中共有 10 个数据, 令每个权值 W1i=1/N=0.1, 其中, N=10,i=1,2,…,10 , 然后分别对于 m=1,2,3,… 等值进行迭代。
Step2:
第二个步骤其实就是一个不断迭代更新的过程, 本例一个要进行三次迭代, 过程如下:
(1)迭代过程 1
对于 m=1 , 在权值分布为 D1(0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1) (10 个数据, 每 个数据的权值皆初始化为 0.1 ) 的训练数据上, 经过计算可得:
阈值 v 取 2.5 时误差率为 0.3(x<2.5 时取 1, x>2.5 时取-1, 则 678 分错, 误差率为 0.3) ,
阈值 v 取 5.5 时误差率最低为 0.4(x<5.5 时取 1, x>5.5 时取-1, 则 345678 皆分错, 误差率 0.6 大于 0.5 , 不可取。故令 x>5.5 时取 1, x<5.5 时取-1, 则 0129 分错, 误差率 为 0.4 ) ,
阈值 v 取 8.5 时误差率为 0.3(x<8.5 时取 1, x>8.5 时取 -1 , 则 345 分错, 误差率为 0.3 。
可以看到, 无论阈值 v 取 2.5, 还是 8.5, 总得分错 3 个样本, 故可任取其中任意一个如 2.5, 弄成第一个基本分类器为:
G1(x)={1−1,x<2.5x>2.5
注:
上述计算所选择的阈值 v 只是比较有代表性的几个, 在计算机运算中肯定是要在每个范 围都设定阈值进行判断的, 只是我们通过直观判断选出这三个阈值所划分的点, 在这几个点 中, 存在错误率最小的点。
由上可以得到 G1(x) 在训练数据集上的误差率 (被 G1(x) 误分类样本 “6 788 ” 的权值之和) e1=P(G1(xi)=yi)=3∗0.1=0.3 。再根据误差率求出 G1 的系数 a1:
a1=21Ine11−e1=0.4236
得到的 a1 的值就是 G1(x) 在最终分类函数中所占的比重。
接下来就是对各个权值进行更新, 其更新结果为 D2=(0.0715,0.0715,0.0715,0.0715,0.0715,0.0715,0.1666,0.1666,0.1666,0.0715) 。由此可以看出, 因为样本中是数据 “6 78 ” 被 G1(x) 分错了, 所以它们的权值由之前的 0.1 增大到 0.1666 , 反之, 其它数据皆被分正确, 所以它 们的权值皆由之前的 0.1 减小到 0.0715 。下面对一个分错的数据如 6 的权值更新过程做如下 的计算: ω17=Zmω0e1a=2e1(1−e1)0.1⋅e1a=0.1666
则分类函数 f1(x)=a1∗G1(x)=0.4236G1(x) , 此时, 得到的第一个基本分类器 sign(f1(x)) 在训练数据集上有 3 个误分类点 (即 678 ) 。
(2)迭代过程 2
对于 m=2 , 在权值分布为 D2=(0.0715,0.0715,0.0715,0.0715,0.0715,0.0715,0.1666,0.1666,0.1666,0.0715)的训练数据上, 经过计算可得:【下划线表示分错的数据】
阈值 v 取 2.5 时误差率为 0.1666 * 3(x<2.5 时取 1, x>2.5 时取 -1 , 则 678 分错, 误差率为 0.1666 * 3) ,
阈值 v 取 5.5 时误差率最低为 0.0715 * 4(x>5.5 时取 1, x<5.5 时取-1, 则 0129 分错, 误 差率为 0.0715 * 3+0.0715 ),
阈值 v 取 8.5 时误差率为 0.0715 * 3(x<8.5 时取 1, x>8.5 时取-1, 则 345 分错, 误差率为 0.0715 * 3) 。
所以, 阈值 v 取 8.5 时误差率最低, 故第二个基本分类器为:
G2(x)={1,−1,x<8.5x>8.5
由上可以得到 G2(x) 在训练数据集上的误差率(被 G2(x) 误分类样本 “3 45 ” 的权值之和)根 据 D2 可知它们的权值为 0.0715,0.0715,0.0715 , 所以 G2(x) 在训练数据集上的误差率 e2=P(G2(xi)=yi)=0.0715∗3=0.2143 。再根据误差率求出 G2 的系数 a2:
a2=21Ine21−e2=0.6496
根据相同的方法, 可以求出 D3=(0.0455,0.0455,0.0455,0.1667,0.1667,0.1667,0.1060,0.1060,0.1060,0.0455) 。则进一步可求出 f2(x)=0.4236G1(x)+0.6496G2(x) 。此时, 得到 的第二个基本分类器 sign(f2(x)) 在训练数据集上有 3 个误分类点 (即 3 4 5 )。
(3)迭代过程 3
对于 m=3 , 在权值分布为 D3=(0.0455,0.0455,0.0455,0.1667,0.1667,0.1667,0.1060,0.1060,0.1060,0.0455) 的训练数据上, 经过计算可得:
阈值 v 取 2.5 时误差率为 0.1060 * 3(x<2.5 时取 1, x>2.5 时取-1, 则 678 分错, 误差率为 0.1060 * 3) ,
阈值 v 取 5.5 时误差率最低为 0.0455 * 4(x>5.5 时取 1, x<5.5 时取-1, 则 0129 分错, 误 差率为 0.0455 * 3+0.0715 ),
阈值 v 取 8.5 时误差率为 0.1667 * 3(x<8.5 时取 1, x>8.5 时取-1, 则 345 分错, 误差率为 0.1667 * 3) 。
所以阈值 v 取 5.5 时误差率最低, 故第三个基本分类器为:
G3(x)={1,−1,x<5.5x>5.5
此时, 被误分类的样本是: 0129 , 这 4 个样本所对应的权值皆为 0.0455 , 所以 G3(x) 在训 练数据集上的误差率 e3=P(G3(xi)=yi)=0.0455∗4=0.1820 。再根据误差率求出计算 G3 的系 数:
a3=21Ine331−e3=0.7154
根据相同的方法,可以求出D4=(0.125,0.125,0.125,0.102,0.102,0.102,0.065,0.065,0.065,0.125)。则进一步可以求出 f3(x)=0.4236G1(x)+0.6496G2(x)+0.7514G3(x)。
此时, 得到的第三个基本分类器 sign(f3(x))在训练数据集上有 0 个误分类点。至 此,整个训练过程结束。
读到这里, 是不是又有点懵逼了呢, 怎么在数据集上就没有误分类点了呢? 刚刚不是还有 4 个吗? 下面来说明这个问题, 我们从第一层迭代开始说起:【注: 首先要说明的是, 这个问 题你是靠看很难看出来的, 拿起笔算算看, 你会发现惊喜】
在第一次迭代中
, 我们说阈值 v 取 2.5 时则 678 分错, 所以误差率为 0.3 , 这里详细的 解释是: 因为样本集中0 1 2 对应的类 ( Y ) 是 1, 因它们本身都小于 2.5 , 所以被 G 1(x) 分在了相应的类 “ 1 ” 中, 分 对了。
3 4 5 本身对应的类 ( Y ) 是-1, 因它们本身都大于 2.5 , 所以被 G 1(x) 分在了相应的类 “-1” 中, 分对了。
但 6 7 8 本身对应类 ( Y ) 是 1, 却因它们本身大于 2.5 而被 G 1(x) 分在了类"-1"中, 所以这 3 个样本分错了。
9 本身对应的类 ( Y ) 是-1, 因它本身大于 2.5, 所以被 G 1(x) 分在了相应的类 “-1” 中, 分对 了。
当我们确定了分类函数 sign(f1(x))=sign(a1∗G1(x))=sign(0.4236G1(x)) 时, 我们就需要 用 sign(f1(x)) 来判断分类是否正确, 即
0 1 2 对应的类 (Y) 是 1, 因它们本身都小于 2.5 , 所以被 sign(f1(x))=sign(0.4236G1(x)) 分 在了相应的类 “1” 中,分对了。
3 4 5 本身对应的类 ( Y ) 是-1, 因它们本身都大于 2.5 , 所以被 sign(f1(x))=sign(0.4236G1(x)) 分在了相应的类 “-1” 中, 分对了。
但 6 7 8 本身对应类 (Y) 是 1, 却因它们本身大于 2.5 而被 sign(f1(x))=sign(0.4236G1(x)) 分在 了类"-1"中, 所以这 3 个样本分错了。
9 本身对应的类 (Y) 是-1, 因它本身大于 2.5 , 所以被 sign(f1(x))=sign(0.4236G1(x)) 分在 了相应的类 “-1” 中, 分对了。
在第二次迭代中
, 我们说阈值 v 取 8.5 时则 3, 4, 5 分错, 这里详细的解释是: 因为样 本集中
3 4 5 本身对应的类 ( Y ) 是-1, 因它们本身都小于 8.5 , 所以被 G 1(x) 分在了相应的类 “1” 中, 分错了。
同样的当我们确定了分类函数 sign(f2(x))=sign(0.4236G1(x)+0.6496G2(x)) 时, 我们需要用sign(f1(x)) 来判断分类是否正确, 即
3 4 5 本身对应的类 (Y) 是-1, 因它们本身都小于 8.5 , 所以被 sign(f2(x))=sign(0.4236G1(x)+0.6496G2(x)) 分在了相应的类 “1” 中, 分错了。
巧合的是, 上面的两次迭代中, 分类函数改变后其数据的分类正确与否并没有变化, 下 面来看第三次迭代过程。
在第三次迭代中
, 我们说阈值 v 取 5.5 时则 0, 1, 2, 9 分错, 这 里详细的解释是: 因为样本集中0 1 2 对应的类 ( Y ) 是 1,因它们本身都小于 5.5,所以被 G3(x)分在了相应的类“-1”中,分错了。
9 对应的类 ( Y ) 是-1, 因它本身大于 5.5 , 所以被 G3(x) 分在了相应的类 “1” 中, 分错了。 同样的当我们确定了分类函数
sign(f3(x))=sign(0.4236G1(x)+0.6496G2(x)+0.7514G3(x))
则:
0 1 2 对应的类 ( Y ) 是 1, 因它们本身都小于 5.5 , 这时被 sign(f3(x)) 分在了相应的类 “ ” 中,分对了。
9 对应的类 ( Y ) 是-1, 因它本身大于 5.5 , 所以被 sign(f3(x)) 分在了相应的类 “1” 中, 分对了。
这样就实现第三个基本分类器 sign(f3(x)) 在训练数据集上有 0 个误分类点, 训练结束。
小结🌴🌴🌴
本节就为大家介绍到这里啦,希望大家都能够理解Adaboost 算法的原理,一起加油叭🥗🥗🥗~~~
如若文章对你有所帮助,那就🛴🛴🛴