集成学习(三)—— Adaboost的理念和推导

Adaboost算法通过赋予错误分类样本更大权重,强化后续模型关注难度样本,且优秀分类器在决策中拥有更高权重,实现逐步提升整体模型性能。本文详解Adaboost理念、流程及推导过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Adaboost的理念与推导

说明

adaboost也是集成学习的一种,也是很多模型一起做决策,最终投票决定,下面会介绍一下adaboost的理念、流程以及简要推导。

理念

1.错题应该被多做

bagging中的抽样是随机的,但更boosting的策略是使那些被分错类的数据以更高的概率出现,简单来说,在平时练习的过程中应该多做错题,这样真正考试的时候才更有把握。

2.强者拥有更多的话语权

我们有很多的分类器,有的分类器厉害一点,正确率高。那么相应的在最终投票的时候,不应该是简单的一人一票,而是强的分类器拥有更多的票数。换句话说,好的分类器的权重应该更大。

3.强者做错的题更加重要

同样是错题,做错的原因可能是这题真的难,但也可能是做题者太菜。因此如果一个很强的人都做错了这题,才能证明这题是真的难。故我们在提升错题下一次的出现概率时,同时也要考虑做题者本身的能力问题。

推导

分类器的权重用α\alphaα表示,数据的权重用www表示,弱分类器用h(x)h(x)h(x)表示,真实值用yyy表示,最终的分类器用H(x)H(x)H(x)表示。

数据分为两类:+1和-1。

我们定义这样定义最终的分类器:
H(x)=∑t=1Tαt⋅h(x)t H(x)=\sum_{t=1}^T\alpha_t\cdot h(x)_t H(x)=t=1Tαth(x)t
虽然我们现在还不知道到α\alphaα的具体值,但是没关系,只要知道它代表了一个分类器的重要性就可以了。显然α\alphaα一定和这个分类器的正确率正相关,但也远不止这么简单,我们后面会推导,别急。

根据我们上面的理念第二条和第三条:错题应该被多做和强者做错的题更加重要。可以这样定义下一次数据的权重分布:
wi+1=wiZ⋅exp{−αih(x)iy} w_{i+1}=\frac{w_i}{Z}\cdot exp\{-\alpha_ih(x)_iy\} wi+1=Zwiexp{αih(x)iy}
其中Z是一个归一化的操作,Z=∑w⋅exp{−αih(x)y}Z=\sum w\cdot exp\{-\alpha_ih(x)y\}Z=wexp{αih(x)y},这样一来就保证了在下一轮的数据权重之和为1。

我们主要来看wi⋅exp{−αih(x)iy}w_i\cdot exp\{-\alpha_ih(x)_iy\}wiexp{αih(x)iy}这部分,有两种情况,预测对了和预测错了。

如果预测对了,则h(x)y为1,−αih(x)iy-\alpha_ih(x)_iyαih(x)iy就一定小于0,也就是说会使exp{−αih(x)iy}exp\{-\alpha_ih(x)_iy\}exp{αih(x)iy}处于0~1之间,就减少了预测正确数据的出现概率;

反之如果预测错了,则h(x)y为-1,−αih(x)iy-\alpha_ih(x)_iyαih(x)iy就一定大于0,也就是说会使exp{−αih(x)iy}exp\{-\alpha_ih(x)_iy\}exp{αih(x)iy}大于1,就增大了预测错误数据的出现概率;

同时增大或减小的幅度由分类器本事的重要性来决定,越重要的分类器比重越大。

下面看一下α\alphaα的推导:

最终分类器损失函数可以这样定义:
J=exp{−H(x)y}=exp{−αh(x)y} J = exp\{-H(x)y\} = exp\{-\alpha h(x)y\} J=exp{H(x)y}=exp{αh(x)y}
也就是说预测正确时,指数部分为负数;预测错误时指数部分为正数。预测正确的越多可以使得J更小,因此这个损失函数的定义是合理的。

我们假定α\alphaα与轮数无关,仅与本次训练有关,则可将上式推广到单轮训练(即将α\alphaαh(x)h(x)h(x)都降了训练轮数那一维)。

则有下式:
J=e−α(预测正确数量)+eα(预测错误数量) J = e^{-\alpha}(预测正确数量) + e^\alpha(预测错误数量) J=eα()+eα()
e−αe^{-\alpha}eα是代表预测正确的部分,即h(x)y得1;eαe^{\alpha}eα是代表预测错误的部分,即h(x)y得-1;

设错误率为ϵ\epsilonϵ,则正确与错误的比为1−ϵ:ϵ1-\epsilon:\epsilon1ϵ:ϵ,损失函数可改写为:
J=e−α(1−ϵ)+eαϵ J = e^{-\alpha}(1-\epsilon) + e^\alpha \epsilon J=eα(1ϵ)+eαϵ
α\alphaα求导可得
∂J∂α=−e−α(1−ϵ)+eαϵ \frac{\partial J}{\partial \alpha}= -e^{-\alpha}(1-\epsilon) + e^\alpha \epsilon αJ=eα(1ϵ)+eαϵ
令其为0可得
α=kln1−ϵϵ \alpha = kln\frac{1-\epsilon}\epsilon α=klnϵ1ϵ
一般k都取0.5,即
α=12ln1−ϵϵ \alpha = \frac12ln\frac{1-\epsilon}\epsilon α=21lnϵ1ϵ

步骤

  1. 初始化一个模型,数据权重均分,计算错误率和模型重要性α\alphaα,更新下一轮数据权重;
  2. 抽数据,算错误率和重要性,算下一轮数据权重;
  3. 重复2直至达到规定轮数;
  4. 输出

sklearn实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles
from sklearn.metrics import classification_report

# 生成二维正太分布
x1,y1 = make_gaussian_quantiles(n_samples = 500,n_features = 2,n_classes = 2)
x2,y2 = make_gaussian_quantiles(mean = (3,3),n_samples = 500,n_features = 2,n_classes = 2)
xdata = np.concatenate((x1,x2))
ydata = np.concatenate((y1,1-y2))
plt.scatter(xdata[:,0],xdata[:,1],c=ydata)
plt.show()

# 画图函数
def plot(model):
    xmin,xmax = xdata[:,0].min()-1,xdata[:,0].max()+1
    ymin,ymax = xdata[:,1].min()-1,xdata[:,1].max()+1
    xx,yy = np.meshgrid(np.arange(xmin,xmax,0.02),
                        np.arange(ymin,ymax,0.02))
    z = model.predict(np.c_[xx.ravel(),yy.ravel()])
    z = z.reshape(xx.shape)
    cs = plt.contourf(xx,yy,z)
    plt.scatter(xdata[:,0],xdata[:,1],c=ydata)
    plt.show()
    
# 建立Adaboost模型
model = AdaBoostClassifier(DecisionTreeClassifier(max_depth=3),n_estimators = 10)
model.fit(xdata,ydata)
plot(model)

生成的数据集如下:
在这里插入图片描述
分类结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值