Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js

模式识别笔记4-集成学习之AdaBoost

目前集成学习(Ensemble Learning) 分为两类:

  • 个体学习器间存在强依赖关系、必须串行化生成的序列化方法:Boosting
  • 个体学习器间不存在强依赖关系,可同时生成的并行化方法:Bagging 和 随机森林

这里先来讲下代表Boosting家族的AdaBoost。
Boosting 是一族可以将弱学习器提升为强学习器的算法。

算法机制
从初始训练集训练一个基学习器(Base Learner) ,根据基学习器的表现对训练样本分布进行调整,对做错的样本赋予更大的权重,基于调整后的样本分布训练下一个基学习器,直到基学习器的数目达到指定的值 TT,,同时进行学习器权重调整。

1. AdaBoost分类算法流程

假设我们有:

  • 训练集 D={(x1,y1),(x2,y2),,(xm,ym)}D={(x1,y1),(x2,y2),,(xm,ym)}

  • 训练轮数(学习器数目): TT

  • 基学习器 ht(x),t={1,2,3,,T}ht(x),t={1,2,3,,T} ,对应于学习算法

  • 基学习器权重 αtαt

  • 样本分布 DD, 训练集在第 tt 个分类器上的样本权重为:

    Dt=(wt1,wt2,,wtm)Dt=(wt1,wt2,,wtm)

针对以上条件,AdaBoost的算法流程如下:

D1=1/mfor t=1,2,,T do    et=P(ht(xi)yi)=mi=1wtiI(ht(xi)yi)    αt=12ln(1etet)    update distribution Dt+1:        wt+1,i=wt,iZt×exp(αtyiht(xi)) for i=1,2,,mend forD1=1/mfor t=1,2,,T do    et=P(ht(xi)yi)=mi=1wtiI(ht(xi)yi)    αt=12ln(1etet)    update distribution Dt+1:        wt+1,i=wt,iZt×exp(αtyiht(xi)) for i=1,2,,mend for(1)(2)(3)(4)

根据这个算法,我们一步步讲AdaBoost的流程。

(1) 初始化权重

对于每个样本,我们令其的初始化权重均为 1m1m

对于指定的基学习器数目 TT,我们知道Boosting 是串行化训练,每一个基学习器都是基于上一个已训练的基学习器继续训练得到的,所以接下来要做 TT 个循环

(2) 获得集合分类误差

以二分类 {+1,1}{+1,1}为例(多分类是二分类的推广),第 tt 个基学习器在训练集上的加权误差即如公式(2)所示。

(3) 基学习器获得权重系数

由公式(3)可以得到当前基学习器的权重系数。

由公式可以知道,误差率越高,则当前基学习器的权重系数越小。至于为什么使用这个系数公式,我们放到Adaboost的损失函数优化的时候再讲。

(4) 更新样本权重

单独把公式(4)拿出来讲:

wt+1,i=wt,iZt×exp(αtyiht(xi))wt+1,i=wt,iZt×exp(αtyiht(xi))(5)

其中 ZtZt 是归一化因子:

Zt=mi=1wt,i×exp(αtyiht(xi))Zt=mi=1wt,i×exp(αtyiht(xi))(6)

可以看到,如果第 ii 个样本分类错误,则 有:

yiht(xi)<0exp(αiyiht(xi))>1wt+1,i>wt,iyiht(xi)<0exp(αiyiht(xi))>1wt+1,i>wt,i(7)(8)

则错误分类的样本会在下一个基学习器的训练中,在数据中占有更高的比重。具体为什么用这个权重更新公式,还是放到损失函数优化的时候讲。

(5) 最终的分类策略

最终的强分类器采用了加权平均:

H(x)=sign(Tt=1αtht(x))H(x)=sign(Tt=1αtht(x))(9)

2. AdaBoost损失函数

AdaBoost使用指数损失函数:

exp(H|D)=mi=1exp(yiHT(x))exp(H|D)=mi=1exp(yiHT(x))(10)

通过最小化这个损失函数,我们可以推导出基学习器的权重系数更新策略和样本权重更新策略。至于为什么最小化指数函数误差就可以最小化分类误差,将在最后推导。

基学习器权重更新策略推导

我们知道,tt 轮训练获得的基学习器是由上一个轮的学习器所得,即有:

Ht(x)=Ht1(x)+αtht(x)Ht(x)=Ht1(x)+αtht(x)(11)

最小化 tt 轮学习后得到的强分类器损失:

(αt,ht(x))=argminα,hmi=1exp(yi(Ht1(x)+αtht(x)))(αt,ht(x))=argminα,hmi=1exp(yi(Ht1(x)+αtht(x)))(12)

我们令 wti=exp(yiHt1(x)),显然,它的值不依赖于 αtht(x), 仅仅依赖于 Ht1(x), 随着迭代改变。

带回式子(12),得

(αt,ht(x))=argminα,hmi=1wtiexp(yiαtht(x))

为了极小化这个损失函数,我们需要极小化第 t 个分类器误差。即:

ht(x)=argminhmi=1wtiI(yih(xi))

将(14)带入损失函数:

mi=1wtiexp(yiαtht(x))=yi=ht(xi)wtieα+yiht(xi)wtieα=mi=1wtieαyiht(xi)wtieα+yiht(xi)wtieα=(eαeα)yiht(xi)wti+eαmi=1wti

对于(15)求偏导,令其为0,得:

(eα+eα)yiht(xi)wtieαmi=1wti=0

在基学习器的迭代中,每轮的分类误差为:

et=miwtiI(yiht(xi))=yiht(xi)wij

注意到 :

et=miwtiI(yiht(xi))mi=1wti

则,式(16)变为:

(eαt+eαt)eteαt=0

解得:

αt=12ln(1etet)

样本权重更新策略推导

根据上一节自定义的 wti,我们知道它与 权重参数只差一个归一化因子 Zt。有:

wt+1,i=exp(yiHt(x))=exp(yi(Ht1(x)+αtht(x)))=exp(yiHt1(x)·exp(yiαtht(x))=wt,i·exp(yiαtht(x))

最小化指数函数误差=最小化分类误差?

最后讲下为什么最小化指数函数误差=最小化分类误差。

回顾一下指数函数误差。

exp(H|D)=mi=1exp(yiHT(x))

为了最小化误差,我们对 H(x)求偏导:

H(x)=eH(x)P(y=1|x)eH(x)P(y=+1|x)

H(x)=0, 解得:

H(x)=12lnP(y=+1|x)P(y=1|x)

则最终强分类器:

sign(H(x))=sign(12lnP(y=+1|x)P(y=1|x))=arg maxy{+1,1}P(y|x)

这意味着最终强分类器达到了贝叶斯最优错误率。换言之,若指数函数最小化,则分类错误率也最小化。

参考资料

posted @   Holy炭  阅读(664)  评论(0编辑  收藏  举报
编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示