adaboost算法原理及sklearn中使用办法_learning rate=0

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

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

第三个问题,更新更新样本权重D。假设第k个弱分类器的样本集权重系数为D(k)=(wk1,wk2,…wkm)D(k)=(wk1,wk2,…wkm),则对应的第k+1个弱分类器的样本集权重系数为

wk+1,i=wkiZKexp(−αkyiGk(xi))wk+1,i=wkiZKexp(−αkyiGk(xi))

这里ZkZk是规范化因子

Zk=∑i=1mwkiexp(−αkyiGk(xi))Zk=∑i=1mwkiexp(−αkyiGk(xi))

从wk+1,iwk+1,i计算公式可以看出,如果第i个样本分类错误,则yiGk(xi)<0yiGk(xi)<0,导致样本的权重在第k+1个弱分类器中增大,如果分类正确,则权重在第k+1个弱分类器中减少.具体为什么采用样本权重更新公式,我们在讲Adaboost的损失函数优化时再讲。

最后一个问题是集合策略。Adaboost分类采用的是加权平均法,最终的强分类器为

f(x)=sign(∑k=1KαkGk(x))f(x)=sign(∑k=1KαkGk(x))

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

我们先看看回归问题的误差率的问题,对于第k个弱学习器,计算他在训练集上的最大误差

Ek=max|yi−Gk(xi)|i=1,2…mEk=max|yi−Gk(xi)|i=1,2…m

然后计算每个样本的相对误差

eki=|yi−Gk(xi)|Ekeki=|yi−Gk(xi)|Ek

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

最终得到第k个弱学习器的 误差率

ek=∑i=1mwkiekiek=∑i=1mwkieki

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

αk=ek1−ekαk=ek1−ek

对于更新更新样本权重D,第k+1个弱学习器的样本集权重系数为

wk+1,i=wkiZkα1−ekikwk+1,i=wkiZkαk1−eki

这里ZkZk是规范化因子

Zk=∑i=1mwkiα1−ekikZk=∑i=1mwkiαk1−eki

最后是结合策略,和分类问题一样,采用的也是加权平均法,最终的强回归器为

f(x)=∑k=1K(ln1αk)Gk(x)f(x)=∑k=1K(ln1αk)Gk(x)

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

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

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

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

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

fk−1(x)=∑i=1k−1αiGi(x)fk−1(x)=∑i=1k−1αiGi(x)

而第k轮的强学习器为

fk(x)=∑i=1kαiGi(x)fk(x)=∑i=1kαiGi(x)

上两式一比较可以得到

fk(x)=fk−1(x)+αkGk(x)fk(x)=fk−1(x)+αkGk(x)

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

Adaboost损失函数为指数函数,即定义损失函数为

argminα,G∑i=1mexp(−yifk(x))argmin⏟α,G∑i=1mexp(−yifk(x))

利用前向分步学习算法的关系可以得到损失函数为

(αk,Gk(x))=argminα,G∑i=1mexp(−yi)(fk−1(x)+αG(x))=argmin⏟α,G∑i=1mexp[(−yi)(fk−1(x)+αG(x))]

令w′ki=exp(−yifk−1(x))wki′=exp(−yifk−1(x)), 它的值不依赖于α,Gα,G,因此与最小化无关,仅仅依赖于fk−1(x)fk−1(x),随着每一轮迭代而改变。

将这个式子带入损失函数,损失函数转化为

(αk,Gk(x))=argminα,G∑i=1mw′kiexp−yiαG(x)=argmin⏟α,G∑i=1mwki′exp[−yiαG(x)]

首先,我们求Gk(x)Gk(x).,可以得到

Gk(x)=argminG∑i=1mw′kiI(yi≠G(xi))Gk(x)=argmin⏟G∑i=1mwki′I(yi≠G(xi))

将Gk(x)Gk(x)带入损失函数,并对αα求导,使其等于0,则就得到了

αk=12log1−ekekαk=12log1−ekek

其中,ekek即为我们前面的分类误差率。

ek=∑i=1mw′kiI(yi≠G(xi))∑i=1mw′ki=∑i=1mwkiI(yi≠G(xi))ek=∑i=1mwki′I(yi≠G(xi))∑i=1mwki′=∑i=1mwkiI(yi≠G(xi))

最后看样本权重的更新。利用fk(x)=fk−1(x)+αkGk(x)fk(x)=fk−1(x)+αkGk(x)和w′ki=exp(−yifk−1(x))wki′=exp(−yifk−1(x)),即可得:

w′k+1,i=w′kiexp[−yiαkGk(x)]wk+1,i′=wki′exp[−yiαkGk(x)]

这样就得到了我们第二节的样本权重更新公式。

4. AdaBoost二元分类问题算法流程

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

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

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

1) 初始化样本集权重为

D(1)=(w11,w12,…w1m);w1i=1m;i=1,2…mD(1)=(w11,w12,…w1m);w1i=1m;i=1,2…m

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

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

b)计算Gk(x)Gk(x)的分类误差率

ek=P(Gk(xi)≠yi)=∑i=1mwkiI(Gk(xi)≠yi)ek=P(Gk(xi)≠yi)=∑i=1mwkiI(Gk(xi)≠yi)

c) 计算弱分类器的系数

αk=12log1−ekekαk=12log1−ekek

d) 更新样本集的权重分布

wk+1,i=wkiZKexp(−αkyiGk(xi))i=1,2,…mwk+1,i=wkiZKexp(−αkyiGk(xi))i=1,2,…m

这里ZkZk是规范化因子

Zk=∑i=1mwkiexp(−αkyiGk(xi))Zk=∑i=1mwkiexp(−αkyiGk(xi))

3) 构建最终分类器为:

f(x)=sign(∑k=1KαkGk(x))f(x)=sign(∑k=1KαkGk(x))

对于Adaboost多元分类算法,其实原理和二元分类类似,最主要区别在弱分类器的系数上。比如Adaboost SAMME算法,它的弱分类器的系数

αk=12log1−ekek+log(R−1)αk=12log1−ekek+log(R−1)

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

5. Adaboost回归问题的算法流程

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

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

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

1) 初始化样本集权重为

D(1)=(w11,w12,…w1m);w1i=1m;i=1,2…mD(1)=(w11,w12,…w1m);w1i=1m;i=1,2…m

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

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

b) 计算训练集上的最大误差

Ek=max|yi−Gk(xi)|i=1,2…mEk=max|yi−Gk(xi)|i=1,2…m

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

如果是线性误差,则eki=|yi−Gk(xi)|Ekeki=|yi−Gk(xi)|Ek;

如果是平方误差,则eki=(yi−Gk(xi))2E2keki=(yi−Gk(xi))2Ek2

如果是指数误差,则eki=1−exp(−yi+Gk(xi))Ek)eki=1−exp(−yi+Gk(xi))Ek)

d) 计算回归误差率

ek=∑i=1mwkiekiek=∑i=1mwkieki

c) 计算弱学习器的系数

αk=ek1−ekαk=ek1−ek

d) 更新样本集的权重分布为

wk+1,i=wkiZkα1−ekikwk+1,i=wkiZkαk1−eki

这里ZkZk是规范化因子

Zk=∑i=1mwkiα1−ekikZk=∑i=1mwkiαk1−eki

3) 构建最终强学习器为:

f(x)=∑k=1K(ln1αk)Gk(x)f(x)=∑k=1K(ln1αk)Gk(x)

6. Adaboost算法的正则化

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

fk(x)=fk−1(x)+αkGk(x)fk(x)=fk−1(x)+αkGk(x)

如果我们加上了正则化项,则有

fk(x)=fk−1(x)+ναkGk(x)fk(x)=fk−1(x)+ναkGk(x)

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

7. Adaboost小结

到这里Adaboost就写完了,前面有一个没有提到,就是弱学习器的类型。理论上任何学习器都可以用于Adaboost.但一般来说,使用最广泛的Adaboost弱学习器是决策树和神经网络。对于决策树,Adaboost分类用了CART分类树,而Adaboost回归用了CART回归树。

这里对Adaboost算法的优缺点做一个总结。

Adaboost的主要优点有:

1)Adaboost作为分类器时,分类精度很高

2)在Adaboost的框架下,可以使用各种回归分类模型来构建弱学习器,非常灵活。

3)作为简单的二元分类器时,构造简单,结果可理解。

4)不容易发生过拟合

Adaboost的主要缺点有:

1)对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性。

集成学习之Adaboost算法原理小结中,我们对Adaboost的算法原理做了一个总结。这里我们就从实用的角度对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=|yi−Gk(xi)|Ekeki=|yi−Gk(xi)|Ek;如果是平方误差,则eki=(yi−Gk(xi))2E2keki=(yi−Gk(xi))2Ek2,如果是指数误差,则eki=1−exp(−yi+Gk(xi))Ek)eki=1−exp(−yi+Gk(xi))Ek),EkEk为训练集上的最大误差Ek=max|yi−Gk(xi)|i=1,2…mEk=max|yi−Gk(xi)|i=1,2…m

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

|Ekeki=|yi−Gk(xi)|Ek;如果是平方误差,则eki=(yi−Gk(xi))2E2keki=(yi−Gk(xi))2Ek2,如果是指数误差,则eki=1−exp(−yi+Gk(xi))Ek)eki=1−exp(−yi+Gk(xi))Ek),EkEk为训练集上的最大误差Ek=max|yi−Gk(xi)|i=1,2…mEk=max|yi−Gk(xi)|i=1,2…m

[外链图片转存中…(img-4VZgpf7t-1715837999842)]
[外链图片转存中…(img-kKhs9o2r-1715837999842)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值