程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)

集成学习值Adaboost算法原理和代码小结(转载)

集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类:

  • 第一个是个体学习器之间存在强依赖关系;
  • 另一类是个体学习器之间不存在强依赖关系。

前者的代表算法就是提升(boosting)系列算法。在boosting系列算法中, Adaboost是最著名的算法之一。Adaboost既可以用作分类,也可以用作回归。本文就对Adaboost算法做一个总结。

一 回顾boosting算法的基本原理

AdaBoost是典型的Boosting算法,属于Boosting家族的一员。在说AdaBoost之前,先说说Boosting提升算法。Boosting算法是将“弱学习算法“提升为“强学习算法”的过程,主要思想是“三个臭皮匠顶个诸葛亮”。一般来说,找到弱学习算法要相对容易一些,然后通过反复学习得到一系列弱分类器,组合这些弱分类器得到一个强分类器。Boosting算法要涉及到两个部分,加法模型和前向分步算法。加法模型就是说强分类器由一系列弱分类器线性相加而成。一般组合形式如下:f(x;P)=k=1Kβkh(x;γk)

其中,h(x;γk) 就是一个个的弱分类器,γk是弱分类器学习到的最优参数,βk 就是弱学习在强分类器中所占比重,P 是所有γkβk 的组合。这些弱分类器线性相加组成强分类器。

前向分步就是说在训练过程中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的。也就是可以写成这样的形式:

fk(x)=fk1(x)+βkhk(x;γk)

由于采用的损失函数不同,Boosting算法也因此有了不同的类型,AdaBoost就是损失函数为指数损失的Boosting算法。

在前面一节,我们已经讲到了boosting算法系列的基本思想,如下图:

从图中可以看出,Boosting算法的工作机制是首先从训练集用初始权重D(1)训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。

在上图中有几个具体的问题我们没有详细说明。

  • 如何计算分类误差率e?
  • 如何得到弱学习器权重系数α(即上式中的βk)?
  • 如何更新训练数据的样本权重D?
  • 使用何种结合策略?

只要是boosting大家族的算法,都要解决这4个问题。那么Adaboost是怎么解决的呢?

 二 Adaboost算法的基本思想

我们这里讲解Adaboost是如何解决上面4个问题的。

假设我们的训练集样本是:T={(x,y1),(x2,y2),...(xm,ym)}

训练集的在第k个弱学习器的样本权重系数为:D(k)=(wk1,wk2,...wkm);i=1mwki=1;w1i=1m;i=1,2...m

注意:在初始化第一个弱分类器输出权重时,我们假设训练集样本具有均匀的权值分布,即每个训练样本在第一个弱分类器的学习中作用相同,这一假设保证可以在训练集样本上学习第一个弱分类器G1(x)

首先我们看看Adaboost的分类问题。

分类问题的误差率很好理解和计算。由于多元分类是二元分类的推广,这里假设我们是二元分类问题,输出为{-1,1},则第k个弱分类器Gk(x)在训练集上的分类误差率为:ek=P(Gk(xi)yi)=i=1mwkiI(Gk(xi)yi)

接着我们看弱学习器权重系数,对于二元分类问题,第k个弱分类器Gk(x)的权重系数为:αk=12log1ekek

为什么这样计算弱学习器权重系数?从上式可以看出,如果分类误差率ek越大,则对应的弱分类器权重系数αk越小。也就是说,误差率小的弱分类器权重系数越大。具体为什么采用这个权重系数公式,我们在讲Adaboost的损失函数优化时再讲。

第三个问题,如何更新样本权重D。假设第k个弱分类器的样本集权重系数为D(k)=(wk1,wk2,...wkm),则对应的第k+1个弱分类器的样本权重系数为:wk+1,i=wkiZKexp(αkyiGk(xi))

这里Zk是规范化因子:Zk=i=1mwkiexp(αkyiGk(xi))

wk+1,i计算公式可以看出,如果第i个样本分类错误,则yiGk(xi)<0,导致样本的权重在第k+1个弱分类器中增大,如果分类正确,则权重在第k+1个弱分类器中减少.不改变所给的训练集数据,通过不断的改变训练样本的权重,使得训练集数据在弱分类器的学习中起不同的作用。具体为什么采用这个样本权重更新公式,我们在讲Adaboost的损失函数优化时再讲。

最后一个问题是集合策略。Adaboost分类采用的是加权平均法,最终的强分类器为:f(x)=sign(k=1KαkGk(x))

系数αk表示了弱分类器Gk(x)的重要性,这里所有α之和并不为1,f(x)的符号决定实例x的类,f(x)的绝对值表示分类的置信度。

接着我们看看Adaboost的回归问题。由于Adaboost的回归问题有很多变种,这里我们以Adaboost R2算法为准。

我们先看看回归问题的误差率的问题,对于第k个弱学习器,计算他在训练集上的最大误差:Ek=max|yiGk(xi)|i=1,2...m

然后计算每个样本的相对误差eki=|yiGk(xi)|Ek

这里是误差损失为线性时的情况,如果我们用平方误差,则eki=(yiGk(xi))2Ek2,如果我们用的是指数误差,则eki=1expyi+Gk(xi))Ek

最终得到第k个弱学习器的 误差率:ek=i=1mwkieki

我们再来看看如何得到弱学习器权重系数α。这里有:αk=ek1ek

对于更新更新样本权重D,第k+1个弱学习器的样本集权重系数为:wk+1,i=wkiZkαk1eki

这里Zk是规范化因子:Zk=i=1mwkiαk1eki

最后是结合策略,和分类问题稍有不同,采用的是对加权的弱学习器取中位数的方法,最终的强回归器为:f(x)=k=1K(ln1αk)g(x)

其中,g(x)是所有αkGk(x),k=1,2,....K的中位数。 

三 AdaBoost分类问题的损失函数优化

上面我们讲到了分类Adaboost的弱学习器权重系数公式和样本权重更新公式。但是没有解释选择这个公式的原因,让人觉得是魔法公式一样。其实它可以从Adaboost的损失函数推导出来。

从另一个角度讲,Adaboost是模型为加法模型,学习算法为前向分步学习算法,损失函数为指数函数的分类问题。

模型为加法模型好理解,我们的最终的强分类器是若干个弱分类器加权平均而得到的。

前向分步学习算法也好理解,我们的算法是通过一轮轮的弱学习器学习,利用前一个弱学习器的结果来更新后一个弱学习器的训练集权重。也就是说,第k-1轮的强学习器为:fk1(x)=i=1k1αiGi(x)

而第k轮的强学习器为:fk(x)=i=1kαiGi(x)

上两式一比较可以得到:fk(x)=fk1(x)+αkGk(x)

可见强学习器的确是通过前向分步学习算法一步步而得到的。

Adaboost损失函数为指数函数,即定义损失函数为:loss=i=1mexp(yifk(xi))

利用前向分步学习算法的关系可以得到损失函数为:loss=i=1mexp[yi(fk1(xi)+αkGk(xi))]

假设已经经过了k1次迭代,fk1(x)已知,令wki=exp(yifk1(xi)), wki依赖于fk1(xi)

wki带入损失函数,损失函数转化为:loss=i=1mwkiexp[yiαkGk(xi)]我们继续化简loss:loss=yi=Gk(xi)wkiexp(αk)+yiGk(xi)wkiexp(αk)

=(exp(αk)exp(αk))i=1mwkiI(yiGk(xi))+exp(αk)i=1mwki

并对α求导,使其等于0,则就得到了:αk=12log1ekek

其中,ek即为我们前面的分类误差率。ek=i=1mwkiI(yiG(xi))i=1mwki=i=1mwkiI(yiG(xi))

最后看样本权重的更新。利用fk(x)=fk1(x)+αkGk(x)wki=exp(yifk1(x)),即可得:wk+1,i=wkiexp[yiαkGk(x)]

这与我们上面说到的样本权重的更新只差一个规范化因子Zk,两者是等价的。

四 AdaBoost二元分类问题算法流程

这里我们对AdaBoost二元分类问题算法流程做一个总结。

输入为样本集T={(x,y1),(x2,y2),...(xm,ym)},输出为{-1, +1},弱分类器算法, 弱分类器迭代次数K。

输出为最终的强分类器f(x)

1) 初始化样本集权重为:D(1)=(w11,w12,...w1m);w1i=1m;i=1,2...m

2) 对于k=1,2,...K:

a) 使用具有权重Dk的样本集来训练数据,得到弱分类器Gk(x)

b)计算Gk(x)的分类误差率:ek=P(Gk(xi)yi)=i=1mwkiI(Gk(xi)yi)

c) 计算弱分类器的系数:αk=12log1ekek

d) 更新样本集的权重分布:wk+1,i=wkiZKexp(αkyiGk(xi))i=1,2,...m

这里Zk是规范化因子:Zk=i=1mwkiexp(αkyiGk(xi))

3) 构建最终分类器为:f(x)=sign(k=1KαkGk(x))    

对于Adaboost多元分类算法,其实原理和二元分类类似,最主要区别在弱分类器的系数上。比如Adaboost SAMME算法,它的弱分类器的系数:αk=12log1ekek+log(R1)

其中R为类别数。从上式可以看出,如果是二元分类,R=2,则上式和我们的二元分类算法中的弱分类器的系数一致。

五 Adaboost回归问题的算法流程

这里我们对AdaBoost回归问题算法流程做一个总结。AdaBoost回归算法变种很多,下面的算法为Adaboost R2回归算法过程。

输入为样本集T={(x,y1),(x2,y2),...(xm,ym)},,弱学习器算法, 弱学习器迭代次数K。

输出为最终的强学习器f(x)

1) 初始化样本集权重为:D(1)=(w11,w12,...w1m);w1i=1m;i=1,2...m

2) 对于k=1,2,...K:

a) 使用具有权重Dk的样本集来训练数据,得到弱学习器Gk(x)

b) 计算训练集上的最大误差:Ek=max|yiGk(xi)|i=1,2...m

c) 计算每个样本的相对误差:

如果是线性误差,则eki=|yiGk(xi)|Ek

如果是平方误差,则eki=(yiGk(xi))2Ek2

如果是指数误差,则eki=1exp|yiGk(xi)|Ek        

d) 计算回归误差率:ek=i=1mwkieki

e) 计算弱学习器的系数:αk=ek1ek

f) 更新样本集的权重分布为:wk+1,i=wkiZkαk1eki

这里Zk是规范化因子:Zk=i=1mwkiαk1eki

3) 构建最终强学习器为:f(x)=k=1K(ln1αk)g(x)

其中,g(x)是所有αkGk(x),k=1,2,....K的中位数。 

六 Adaboost算法的正则化

为了防止Adaboost过拟合,我们通常也会加入正则化项,这个正则化项我们通常称为步长(learning rate)。定义为ν,对于前面的弱学习器的迭代:fk(x)=fk1(x)+αkGk(x)

如果我们加上了正则化项,则有:fk(x)=fk1(x)+ναkGk(x)

ν的取值范围为0<ν1。对于同样的训练集学习效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。

七 Adaboost的例子

给定如下表所示训练数据,假设弱分类器由x<vx>v产生,可以看做由一个根节点直接连接两个叶节点的简单决策树,其阈值v使该分类器在训练数据集上的分类误差率最低,试用Adaboost算法学习一个强分类器。

序号 1 2 3 4 5 6 7 8 9 10
x 0 1 2 3 4 5 6 7 8 9
y 1 1 1 -1 -1 -1 1 1 1 -1

解:初始化样本权重系数:D1=w11,w12,...,w110;w1i=0.1,i=1,2,...,10

对于k=1:

a、在权重为D1的训练数据上、阈值v取2.5时分类误差率最低,故弱分类器为:G1(x)={1,x<2.51,x>2.5

b、G1(x)在训练数据集上的分类误差率e1=P(G1(xi)yi)=0.3

c、计算G1(x)的系数:α1=12log1e1e1=0.4236

d、更新样本的权重分布:D2=w21,...,w2i,...,w210;w2i=w1iZ1exp(α1yiG1(xi)),i=1,2,...,10 D2=(0.07143,0.07143,0.07143,0.07143,0.07143,0.07143,0.16667,0.16667,0.16667,0.07143) f1(x)=0.4236G1(x) 

分类器sign[f1(x)]在训练数据集上有3个误分类点。

对于k=2:

a、在权重为D2的训练数据上、阈值v取8.5时分类误差率最低,故弱分类器为:G2(x)={1,x<8.51,x>8.5

b、G2(x)在训练数据集上的分类误差率e2=P(G2(xi)yi)=0.2143

c、计算G2(x)的系数:α2=12log1e2e2=0.6496

d、更新样本的权重分布:D3=w31,...,w3i,...,w310;w3i=w2iZ2exp(α2yiG2(xi)),i=1,2,...,10 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个误分类点。

对于k=3:

a、在权重为D3的训练数据上、阈值v取5.5时分类误差率最低,故弱分类器为:G3(x)={1,x>5.51,x<5.5

b、G3(x)在训练数据集上的分类误差率e3=P(G3(xi)yi)=0.1820

c、计算G3(x)的系数:α3=12log1e3e3=0.7514

d、更新样本的权重分布:D4=w41,...,w4i,...,w410;w4i=w3iZ3exp(α3yiG3(xi)),i=1,2,...,10 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个误分类点。

于是最终分类器为:G(x)=sign[f3(x)]=sign[0.4236G1(x)+0.6496G2(x)+0.7514G3(x)]

八 scikit-learn Adaboost类库使用小结

1. Adaboost类库概述

scikit-learn中Adaboost类库比较直接,就是AdaBoostClassifier和AdaBoostRegressor两个,从名字就可以看出AdaBoostClassifier用于分类,AdaBoostRegressor用于回归。

AdaBoostClassifier使用了两种Adaboost分类算法的实现,SAMME和SAMME.R。而AdaBoostRegressor则使用了讲到的Adaboost回归算法的实现,即Adaboost.R2。

当我们对Adaboost调参时,主要要对两部分内容进行调参,第一部分是对我们的Adaboost的框架进行调参, 第二部分是对我们选择的弱分类器进行调参。两者相辅相成。下面就对Adaboost的两个类:AdaBoostClassifier和AdaBoostRegressor从这两部分做一个介绍。

2. AdaBoostClassifier和AdaBoostRegressor框架参数

我们首先来看看AdaBoostClassifier和AdaBoostRegressor框架参数。两者大部分框架参数相同,下面我们一起讨论这些参数,两个类如果有不同点我们会指出。

1)base_estimator:AdaBoostClassifier和AdaBoostRegressor都有,即我们的弱分类学习器或者弱回归学习器。理论上可以选择任何一个分类或者回归学习器,不过需要支持样本权重。我们常用的一般是CART决策树或者神经网络MLP。默认是决策树,即AdaBoostClassifier默认使用CART分类树DecisionTreeClassifier,而AdaBoostRegressor默认使用CART回归树DecisionTreeRegressor。另外有一个要注意的点是,如果我们选择的AdaBoostClassifier算法是SAMME.R,则我们的弱分类学习器还需要支持概率预测,也就是在scikit-learn中弱分类学习器对应的预测方法除了predict还需要有predict_proba。

2)algorithm:这个参数只有AdaBoostClassifier有。主要原因是scikit-learn实现了两种Adaboost分类算法,SAMME和SAMME.R。两者的主要区别是弱学习器权重的度量,SAMME使用了和我们的原理篇里二元分类Adaboost算法的扩展,即用对样本集分类效果作为弱学习器权重,而SAMME.R使用了对样本集分类的预测概率大小来作为弱学习器权重。由于SAMME.R使用了概率度量的连续值,迭代一般比SAMME快,因此AdaBoostClassifier的默认算法algorithm的值也是SAMME.R。我们一般使用默认的SAMME.R就够了,但是要注意的是使用了SAMME.R, 则弱分类学习器参数base_estimator必须限制使用支持概率预测的分类器。SAMME算法则没有这个限制。

3)loss:这个参数只有AdaBoostRegressor有,Adaboost.R2算法需要用到。有线性‘linear’, 平方‘square’和指数 ‘exponential’三种选择, 默认是线性,一般使用线性就足够了,除非你怀疑这个参数导致拟合程度不好。这个值的意义在原理中我们也讲到了,它对应了我们对第k个弱分类器的中第i个样本的误差的处理,即:如果是线性误差,则eki=|yiGk(xi)|Ek;如果是平方误差,则eki=(yiGk(xi))2Ek2,如果是指数误差,则eki=1expyi+Gk(xi))EkEk为训练集上的最大误差Ek=max|yiGk(xi)|i=1,2...m

4) n_estimators: AdaBoostClassifier和AdaBoostRegressor都有,就是我们的弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是50。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。

5) learning_rate:  AdaBoostClassifier和AdaBoostRegressor都有,即每个弱学习器的权重缩减系数ν,在原理中的正则化小节我们也讲到了,加上了正则化项,我们的强学习器的迭代公式为fk(x)=fk1(x)+ναkGk(x)ν的取值范围为0<ν1。对于同样的训练集拟合效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的ν开始调参,默认是1。

3. AdaBoostClassifier和AdaBoostRegressor弱学习器参数

亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。

日期姓名金额
2023-09-06*源19
2023-09-11*朝科88
2023-09-21*号5
2023-09-16*真60
2023-10-26*通9.9
2023-11-04*慎0.66
2023-11-24*恩0.01
2023-12-30I*B1
2024-01-28*兴20
2024-02-01QYing20
2024-02-11*督6
2024-02-18一*x1
2024-02-20c*l18.88
2024-01-01*I5
2024-04-08*程150
2024-04-18*超20
2024-04-26.*V30
2024-05-08D*W5
2024-05-29*辉20
2024-05-30*雄10
2024-06-08*:10
2024-06-23小狮子666
2024-06-28*s6.66
2024-06-29*炼1
2024-06-30*!1
2024-07-08*方20
2024-07-18A*16.66
2024-07-31*北12
2024-08-13*基1
2024-08-23n*s2
2024-09-02*源50
2024-09-04*J2
2024-09-06*强8.8
2024-09-09*波1
2024-09-10*口1
2024-09-10*波1
2024-09-12*波10
2024-09-18*明1.68
2024-09-26B*h10
2024-09-3010
2024-10-02M*i1
2024-10-14*朋10
2024-10-22*海10
2024-10-23*南10
2024-10-26*节6.66
2024-10-27*o5
2024-10-28W*F6.66
2024-10-29R*n6.66
2024-11-02*球6
2024-11-021*鑫6.66
2024-11-25*沙5
2024-11-29C*n2.88
posted @   大奥特曼打小怪兽  阅读(4531)  评论(2编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
如果有任何技术小问题,欢迎大家交流沟通,共同进步

公告 & 打赏

>>

欢迎打赏支持我 ^_^

最新公告

程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)。

了解更多

点击右上角即可分享
微信分享提示