【集成学习】
集成学习,通过构建并组合一系列的个体学习器(基学习器或组件学习器)来完成学习任务。对于个体学习器可分为:①同质学习器(基学习器)、②异质学习器(组件学习器)。这里的同质和异质指:个体学习器是否为同种类型的学习器(学习算法一致),例如:都是决策树算法得到的个体学习器(同质);既有决策树算法得到的个体学习器,又有其他算法得到的学习器(异质)。
弱学习器,指泛化性能略优于随机猜测的学习器;那么相对的,强学习器,指泛化性能较好的学习器。我们一般称基学习器或者简单算法的个体学习器为弱学习器。集成学习,就是对一系列弱学习器进行组合,进而构建出强学习器的一种策略(算法)。
从理论上讲,使用弱学习器集成足以获得很好的效果,但是在实际过程中,为了追求更好的效果,人们往往更倾向于选择泛化性能较强的学习器。
对个体学习器的要求: 要获得好的集成效果,个体学习器应该“好而不同”,即个体学习器要有一定的“准确性”,即学习器不能太坏,并且要有“多样性”,即学习器间要有差异。由于“准确性”和“多样性”本身就存在冲突,(根据交叉验证方式:“准确性”依托大量的样本,就会降低训练集的“多样性”,进而导致个体学习器“多样性”下降)所以如何产生并结合“好而不同”的个体学习器,恰恰是集成学习研究的核心内容。
多个弱学习器集成就可以得到强学习器的推导:
以二分类问题为例,预测值y∈{−1,1}和真实函数f(x),假定基分类器的错误率为ϵ,则有:
P(hi(x)≠f(x))=ϵ
假设集成通过简单投票法结合T个基分类器,若有超过半数的基分类器正确,则集成分类就正确:
H(x)=sign(i=1∑Thi(x))
假设基分类器的错误率相互独立,则可得:
P(hi(x)≠f(x))=k=0∑⌊T/2⌋(Tk)(1−ϵ)kϵT−k≤exp(−21T(1−2ϵ)2)
故,随着个体学习器数目T的增大,集成的错误率将指数级下降,并最终趋于0。这就是为什么多个弱学习器能够组合出强学习器的原因所在。
- Boosting:个体学习器之间存在强依赖关系,必须串行生成的序列化方法。
- Bagging:个体学习器之间存在弱依赖关系,可同时生成的并行化方法。
【Boosting—Adaboost算法】
Boosting算法是一族可将弱学习器提升为强学习器的算法。Boosting族算法的工作机制如下:
先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。 ———源自周志华《机器学习》
Adaboost算法,英文全称为:Adaptive Boosting,即自适应增强,是一种典型的Boosting算法。其实现思路如下(类比Boosting的工作机制):
利用“重赋权法”(re-weighting),即在训练过程的每一轮中,根据样本分布为每个训练样本重新赋予一个权重。
首先,初始化训练集权重分布。即先对原始训练集中的每个样本赋予相同的权重,假如训练集有N个样本,那么每个样本的初始权重均为N1
其次,循环训练弱分类器。将加有权重的训练集用于训练弱学习器,在训练过程中,如果某个样本能够准确地分类和预测,那么在构造下一个训练集的过程中,就要降低该样本的权重,同时增加无法准确分类或预测的样本的权重。重新确定样本权重后,然后进行下一次弱学习器的训练。如此重复进行,直至基学习器数目达到事先指定的值T或者准确率。
最后,组合生成的多个弱学习器得到强学习器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
AdaBoost算法编程流程图(西瓜书)
Adaboost算法详细实现过程
假定给出了一个二分类训练数据集
T={(x1,y1),(x2,y2),⋯,(xn,yn)}
其中yi属于二分类的标记组合,即yi∈{+1,−1}。
-
Step 1 初始化训练数据的权值分布
首先将训练集中每一个样本赋予相同的权重,即N1,即每个训练样本在基本分类器的学习中作用相同,用数学化的语言表示为:
D1=(w11,w12,⋯,w1i,⋯,w1N) w1i=N1 ,i=1,2,⋯,N
-
Step 2 迭代训练基学习器
用m表示迭代的轮数,其中m=1,2,3,⋯,M
- 使用具有权值分布Dm的训练数据集学习,得到基本分类器
Gm(x):χ→{−1,+1}
- 计算得到的基分类器Gm(x)在训练数据集上的分类误差率em
em=P(Gm(x)≠yi)=∑i=1Nwmi∑i=1NwmiI(Gm(xi)≠yi)=i=1∑NwmiI(Gm(xi)≠yi)
其中wmi表示第m轮中第i个样本的权重,∑i=1Nwmi=1,I(Gm(xi)≠yi)为指示函数,表示Gm(xi)≠yi时I(Gm(xi)≠yi)=1,否则等于0。
以上公式表明,Gm(x)在加权的训练数据集上的分类误差率是被Gm(x)误分类样本的权值之和。
- 计算Gm前面的权重系数am,该系数表示Gm在最终分类器中的重要程度 ,目的在于使我们得到基分类器在最终分类器中所占的权值,系数计算公式如下:
αm=21lnem1−em
由表达式可知,当em≤12时,am≥0,并且am随着em的减小而增大,意味着分类误差越小的基本分类器在最终分类器的作用越大,而em≥12则刚好相反,这正好验证了集成学习中每个个体分类器的分类精度必须大于0.5的前提条件。
- 更新训练数据集的权值分布(目的:得到样本的新的权值分布),用于下一轮迭代。
Dm+1=(wm+1,1,wm+1,2,⋯,wm+1,i,⋯,wm+1,N)
其中:wm+1,i=Zmwmiexp(−αmyiGm(xi)),i=1,2,⋯,N
Zm是我们引入的一个规范化因子,它的作用在于使Dm+1成为一个概率分布,公式如下:
Zm=i=1∑Nwmiexp(−αmyiGm(xi)),i=1,2,⋯,N
由于是二分类,所以对上式可进一步可简化为:
wm+1,i={Zmwmie−αm ,Zmwmieαm ,Gm(xi)=yiGm(xi)≠yi
由此可知,被基本分类器Gm(x)误分类样本的权值得以扩大,而被正确分类样本的权值得以缩小。两两比较,误分类样本的权值e2αm=1−emem因此,误分类样本在下一轮学习中起更大的作用。不改变所给的训练数据,而不断改变训练数据权值的分布,使得训练数据在基本分类器的学习中起不同的作业,这是AdaBoost的一个特点。
- 重复步骤二中的1至4步骤,得到一系列的权重参数am和基分类器Gm。
-
Step 3 根据权重参数线性组合各个基学习器
f(x)=m=1∑MαmGm(x)
借助sign()函数,将f(x)的连续值转化为离散值,故最终的分类器为:
G(x)=sign(f(x))=sign(m=1∑MαmGm(x))
线性组合f(x)实现了M个基本分类器的加权表决。系数am表示了基本分类器Gm(x)的重要性,这里,所有的am之和并不为1。f(x)的符号决定实例x的类,f(x)的绝对值表示分类的确信度,利用基本分类器的线性组合构建最终分类器是AdaBoost的另一特点。
【例子说明】
目前查阅到的案例都是基于统计学习方法 李航著第8章8.1.3的Adaboost样例的叙述。在此不做过多的赘述,强烈建议参考该样例加深对Adaboost算法的理解。
【理论推导——坚持看下去】
AdaBoost的训练误差界
定义AdaBoost的训练误差界为:
N1i=1∑NI(G(xi≠yi))≤N1i∑exp(−yif(xi))=m∏Zm
其中:
G(x)Zmf(x)=sign(f(x))=sign(m=1∑MαmGm(x))=i=1∑Nwmiexp(−αmyiGm(xi))=m=1∑MαmGm(x)
证明过程如下:
4. 当G(xi)≠yi时,yif(xi)<0,因而exp(−yif(xi))≥1。由此直接推导出前半部分。
5. 后半部分的推导需要用到
wm+1,i=Zmwmiexp(−αmyiGm(xi)),i=1,2,⋯,N
进而可得:
wmiexp(−αmyiGm(xi))=Zmwm+1,i
继续推导:
N1i∑exp(−yif(xi))=N1i∑exp(−m=1∑MαmyiGm(xi))=i∑w1im=1∏Mexp(−αmyiGm(xi))=Z1i∑w2im=2∏Mexp(−αmyiGm(xi))=Z1Z2i∑w3im=3∏Mexp(−αmyiGm(xi))=Z1Z2⋯ZM−1i∑wMiexp(−αMyiGm(xi))=m=1∏MZm
这一定理说明,可以在每一轮选取适当的Gm使得Zm最小,从而使训练误差下降最快。
二分类问题的AdaBoost训练误差界
在AdaBoost训练误差界的基础之上,如果分类问题是二分类问题,那么根据以上结果我们可以进一步得到以下结论:
m=1∏MZm=m=1∏M[2em(1−em)]=m=1∏M(1−4γm2)≤exp(−2m=1∑Mγm2)
其中:γm=21−em
推导如下:
Zm=i=1∑Nwmiexp(−αmyiGm(xi))=yi=Gm(xi)∑wmiexp(−αm)+yi≠Gm(xi)∑wmiexp(αm)=(1−em)e−αm+emeαm=2em(1−em)=1−4γm2
再者,根据先由ex和(1−x)在x=0处的泰勒展开式
ex=1+x+21x2+⋯+n!1xn+O(xn)
(1−x)21=1−21x−81x2+⋯+O(xn)
可得:(1−4γm2)≤exp(−2γm2)
故结论得证。
进一步引申为:
由上述两个定理推出,如果存在γ>0,对所有m有γm⩾γ,则
N1i=1∑NI(G(xi)≠yi)≤exp(−2Mγ2)
结论: AdaBoost的训练误差是以指数速率下降的。另外,AdaBoost算法不需要事先知道下界γ,AdaBoost具有自适应性,它能适应弱分类器各自的训练误差率 。
【AdaBoost算法的另一种理解——前项分步算法】
Adaboost 还有另外一种理解,即认为其算法模型是加法模型、损失函数为指数函数、学习算法为前向分步算法的二类分类学习方法。对于这种理解,我最直接的疑问就是,为什么AdaBoost的算是函数是指数损失函数?对此查阅了一些资料也不是很理解,但是从指数损失函数的式子去验证,也可以用来表示AdaBoost的损失。关于损失函数部分内容,请参考:【深度学习】一文读懂机器学习常用损失函数
加法模型(对应AdaBoost最终的f(x))
f(x)=m=1∑Mβmb(x;γm)
其中b(x;γm)为基函数,γm为基函数的参数,βm为基函数的系数。
损失函数极小化
在给定训练数据及损失函数L(y,f(x))的条件下,学习加法模型f(x)成为经验风险极小化即损失函数极小
βm,γmmini=1∑NL(yi,m=1∑Mβmb(xi;γm))
前向分步算法
由于学习的是加法模型,如果可以从前往后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式(即损失函数极小化表达式),那么就可以简化优化的复杂度。具体地,每一步只需要优化如下损失函数:
β,γmini=1∑NL(yi,m=1∑Mβb(x;γ))
看完上面的公式,貌似还不是很理解什么是前向分步算法,具体步骤如下:
输入:
训练数据集T={(x1,y1),(x2,y2),⋯,(xN,yN)}
损失函数L(y,f(x));
基函数(基学习器)集:{b(x;γ)}
输出: 加法模型f(x)
- 初始化f0(x)=0
- 对m=1,2,⋯,M
a. 极小化损失函数
(βm,γm)=argβ,γmini=1∑NL(yi,fm−1(xi)+βb(xi;γ))
得到参数βm,γm
b. 更新
fm(x)=fm−1(x)+βmb(x;γm)
- 得到加法模型
f(x)=fM(x)=m=1∑Mβmb(x;γm)
这样,前向分步算法将同时求解从m=1到M所有参数βm,γm的优化问题简化为逐次求解各个βm,γm的优化问题。
基于前向分步算法的推导
前向分布算法学习的是加法模型,当基函数为基本分类器时,该加法模型等价于AdaBoost的最终分类器f(x)=∑m=1MαmGm(x),它由基分类器Gm(x)和权重参数αm。前向分步算法逐一学习基函数,这一过程与AdaBoost算法逐一学习基本分类器的过程一致。
证明: 前向分步算法的损失函数是指数函数:L(y,f(x))=exp[−yf(x)]
其学习的具体操作等价于AdaBoost算法学习的具体操作。
假设经过m−1轮迭代前向分步算法已经得到fm−1(x) :
fm−1(x)=fm−2(x)+αm−1Gm−1(x)=α1G1(x)+α2G2(x)+⋯+αm−1Gm−1(x)
在m轮迭代得到αm,Gm(x)和fm(x),表示为
fm(x)=fm−1(x)+αmGm(x)
此时参数αm和Gm(x)均未知。因此,我们的目标是要得到最小化损失函数,通过最小化损失函数来得到模型中所需要的参数。而在AdaBoost算法中,每一轮都需要更新样本的权值参数,故而在每一轮的迭代中需要加工损失函数极小化,然后据此得到每个样例的权重更新参数。这样在每轮的迭代过程中只需要将当前基函数在训练集上的损失函数最小,最终使得fm(x)在训练样本上的指数损失最小。
通过求损失函数最小化确定参数与基函数:
(αm,Gm(x))=argα,Gmini=1∑Nexp[−yi(fm−1(xi)+αG(xi))]
注意,在此处假定G1(x),G2(x),⋯,Gm−1(x)和a1,a2,⋯,am−1已知,为常量,进而计算Gm(x)和αm。故上式进一步化简为:
(αm,Gm(x))=argα,Gmini=1∑Nw¯miexp[−yiαG(xi)]
其中:w¯mi=exp[−yifm−1(xi)]
因为w¯mi既不依赖α也不依赖于G(x),所以与最小化无关。但它依赖于fm−1(x),随着每一次迭代而发生改变。
现证使上式达到最小的αm和Gm(x)就是AdaBoost算法所得到的αm和Gm(x)。求解可分为两步:
- Step 1 求Gm(x)
首先,求Gm∗(x)。对任意的α>0,使指数损失函数(上式)最小的G(x)由下式得到:
Gm∗(x)=argGmini=1∑Nw¯miI(yi≠G(xi))
其中:w¯mi=exp[−yifm−1(xi)]
此分类器Gm∗即为AdaBoost算法的基本分类器Gm(x),因为它是使第m轮加权训练数据分类误差率最小的基本分类器。
- Step 2 求αm∗
i=1∑Nw¯miexp[−yiαG(xi)]=yi=Gm(xi)∑w¯mie−α+yi≠Gm(xi)∑w¯mieα=eαyi≠Gm(xi)∑w¯mi−e−αyi≠Gm(xi)∑w¯mi+e−αyi≠Gm(xi)∑w¯mi+e−αyi=Gm(xi)∑w¯mi=(eα−e−α)i=1∑Nw¯miI(yi≠G(xi))+e−αi=1∑Nw¯mi
将已求得的Gm(x)代入上式,对α求导并使导数为0,即得到使其损失函数最小的α。设:
g(α)=(eα−e−α)i=1∑Nw¯miI(yi≠G(xi))+e−αi=1∑Nw¯mi
求g(α)的极小值,令g′(α)=0则:
∂α∂g(α)=(eα+e−α)i=1∑Nw¯miI(yi≠G(xi))−e−αi=1∑Nw¯mi=0
移项得:
(eα+e−α)i=1∑Nw¯miI(yi≠G(xi))=e−αi=1∑Nw¯mi
进一步化简可得:
(e2α+1)i=1∑Nw¯miI(yi≠G(xi))=i=1∑Nw¯mi
两边除以右侧项可得:
(e2α+1)∑i=1Nw¯mi∑i=1Nw¯miI(yi≠G(xi))=1
其中,em对应AdaBoost算法中的分类误差率,即:
em=∑i=1Nw¯mi∑i=1Nw¯miI(yi≠G(xi))=i=1∑NwmiI(yi≠Gm(xi))
可得:em(e2α+1)=1
从而可得:使损失函数最小的α,即:
αm∗=21logem1−em
这里的αm∗与AdaBoost算法中求得的αm完全一致。
最后来看一下每一轮样本权值的更新。由
fm(x)=fm−1(x)+αmGm(x)
并且w¯mi=exp[−yifm−1(x)]可得:
w¯m+1,i=exp[−yifm(x)]=exp[−yi(fm−1(x)+αmGm(x))]=w¯miexp[−yiαmGm(x)]
这与开篇中所提到的AdaBoost的算法流程中的权重系数wm+1,i仅相差一个规范化因子Zm,因而是等价的。
以上推导内容大部分都是来自 统计学习方法 李航著,由于AdaBoost的推导公式目前都遵循这一推导规范,避免不了很多内容重复,所以还请见谅。
打开App,阅读手记