AdaBoost 多分类原理 + 公式推导 + 案例演示

AdaBoost(Adaptive Boosting,自适应提升)算法由 Yoav Freund 和 Robert Schapire 于 1995 年提出,是一种能自动找出薄弱环节并不断改进的集体学习方法,是机器学习历史上具有里程碑意义的算法。它首次在理论上证明:即使是性能较弱的模型,只要经过合理的组合,也能形成一个强大的分类器。凭借简单而高效的设计,它在图像识别、医学诊断、金融风控等多个领域得到广泛应用。

传统 AdaBoost 用于二分类,Scikit-Learn 中实现的是其多分类扩展版本 SAMME(Stagewise Additive Modeling using a Multi-class Exponential loss)。

Paper:https://link.intlpress.com/JDetail/1806634576447516674

1. 基本原理

1.1 预测过程

预测过程:

  1. 每个弱学习器对输入样本的各类别分别打分
  2. 将所有弱学习器的类别分数按各自模型权重加权求和
  3. 得分最高的类别即为最终预测结果

1.2 训练过程

AdaBoost 的目标:把一堆单兵作战能力一般的小模型,训练成一个协同作战的强模型。它的秘诀只有两样:样本权重模型权重

样本权重是它的引导机制。上一轮弱学习器把某些样本判错了,这些样本的权重就会提高。判对了的样本权重会下降。下一轮训练时,弱学习器会自然把更多精力放在那些前任处理不好的样本上。如此往复,每个弱学习器都在专门修补前一轮的盲点。

但小模型之间也有水平高低。有的弱学习器确实学到了东西,有的则只是混了一下训练流程。这就需要模型权重来分配话语权:表现好的弱学习器权重大、影响力强。表现差的弱学习器被自动降权,避免它们把整体结果带偏。

整个训练可以这样概括:

  • 初始样本权重全部相同
  • 用当前样本权重训练弱学习器
  • 根据弱学习器的错误率计算模型权重
  • 根据该弱学习器的预测结果更新样本权重,让误分样本在下一轮更显眼
  • 重复上述步骤,逐步累积多个弱学习器

说到底,AdaBoost 的训练像是一场接力赛,每一棒都试图弥补上一棒留下的漏洞,最终把这些不那么完美的弱选手,组合成一个尽可能可靠的强模型。

下面对重要概念进行总结:

  • 核心思想:通过组合多个弱学习器,逐步提升整体分类性能,训练过程是串行的,每一轮都依赖上一轮的结果
  • 样本权重:通过动态调整样本权重,让分类错误或难分的样本在下一轮获得更高关注度。
  • 模型权重:每个弱学习器都被赋予一个模型权重,表示其重要性,权重越大,对最终预测影响越强
  • 预测方式:最终预测由所有弱学习器的加权投票得到
  • 弱学习器:通常使用非常简单的模型,性能略优于随机猜测,能有效避免过拟合

2. 公式推导

前面对算法训练过程的描述都只是思路,到底错一个样本,样本权重该涨多少?模型权重应该怎么计算?这些问题全靠猜或者拍脑袋,算法就没法落地。

为了让样本权重怎么调、模型权重怎么定都变成精确而可执行的规则,我们需要进行公式推导,把这些口头的直觉,变成清晰的数学步骤,让 AdaBoost 的机制从想法变成算法。

2.1 目标函数

其中:

  • \( F_{m}(x) \) 也是一个 \( K \) 维的向量,表示每个类别预测得分
  • \(\alpha_{t}\)​ 表示第 t 个弱分类器的权重
  • \( h_{t}(x) \) 表示弱分类器输出的类别标签

假设共有 \(K\) 个类别,输出类别为 \(c\),我们将其编码为一个 \(k\) 维的向量 \(y=(y_{1}…y_{k})\) ,则:

假设有 \( 3 \)个类别,假设某个样本的真实标签为:

  • 如果标签 1 时,可示为 \( (1, -\frac{1}{2}, -\frac{1}{2}) \) 向量。
  • 如果标签 2 时,可示为 \( (-\frac{1}{2}, 1, -\frac{1}{2}) \) 向量。
  • 如果标签 3 时,可示为 \( (-\frac{1}{2}, -\frac{1}{2}, 1) \) 向量。

AdaBoost 的目标是最小化加权指数损失,单个样本的损失表示可表示为:

假设:真实标签 \(y\) 为: \((1, -1/2, -1/2)\)

  • 如果预测正确,\( F_{m}(x) \) 输出分数为:\((0.8, -0.4, -0.4)\),则指数损失为:0.67
  • 如果预测错误,\( F_{m}(x) \) 输出分数为:\((-0.4, 0.8, -0.4)\),则指数损失为:1.22

并且,预测正确的分数越大,则损失越小。预测错误的分数越大,则损失越大。所有训练样本的损失表示如下,我们优化的目标就是得到每个弱学习器的权重,从而使得正确类别预测的分数尽可能的大。

2.2 模型权重

在第 \( m \) 轮的输出,可以由下面的公式表示:

我们的损失函数可以表示为:

将目标函数展开:

上述公式中:

  • 第一项:表示第 i 个样本在 m 弱学习器的损失时的样本权重,权重的大小由前面弱学习器对该样本的预测情况来决定,如果预测正确,并且预测正确分数较高,则权重较低。如果预测错误,则预测错误分数越高,则权重越高。
  • 第二项:表示第 i 个样本在 m 弱学习器的损失

我们把第一项样本权重使用 \( w_{i}(m) \) 表示,则得到公式:

样本权重是由上一个弱学习器的预测结果来确定的。如果上一轮弱学习器预测错误,则样本的权重在下一轮中会相应增大。反之,若预测正确,样本权重会减小。这样,新的弱学习器在训练时会更加关注那些此前被错误分类的样本,从而逐步提升整体模型的分类性能。


损失函数是由分类正确的样本的损失、分类错误样本的损失构成,因此目标函数可以写成:

接下来,我们推导一下 \( y_{i}^{T}h_{m}(x_{i}) \) 在预测正确和错误时的结果是什么。假设预测正确,则真实标签和模型预测标签可以表示如下:

那么,如果预测错误的话:

把分类正确、分类错误时得到的公式代入原来损失函数,得到下面的公式:


我们希望知道当前弱学习器的权重 \( \alpha_{m} \) 是什么,才能使得损失函数最小。接下来,对 \( \alpha_{m} \) 进行求导,并令导数为 0,再化简之后,得到下面的公式:

我们看到,分母表示错误样本的权重,表示当前弱学习器的加权错误率。我们用 \( err_{t} \) 来表示分母的加权错误率,则分子加权正确率可以表示为 \( 1- err_{t} \)。

我们再把前面的系数 \( \frac{(K-1)^2}{K} \) 去掉,则得到模型的权重计算公式:

在三分类场景中,随机猜测的准确率为 1/3,对应错误率为1−1/3 ​≈ 0.67。若某弱学习器的错误率高于此(如取 err ​= 0.68),代入多分类 AdaBoost 的权重公式,计算得模型权重约为−0.06。

这一结果揭示了 AdaBoost 的核心约束:算法要求每个弱学习器的错误率必须低于随机猜测的错误率(即二分类中 err​ < 0.5,多分类中 err ​<1−1/K​)。若弱学习器无法满足这一条件,其权重会为负,纳入集成后反而会降低模型性能。因此,AdaBoost 在迭代训练时,若找不到错误率低于随机猜测的弱学习器,会直接停止训练。

2.3 样本权重

每一轮弱学习器训练时,样本的权重是由前面弱学习器的预测情况来确定:

当前弱学习器训练完成之后,下一轮弱学习器训练时的样本权重可以用下面的公式表示:

我们把前面得到的 \( y_{i}^{T}h_{m}(x_{i}) \) 代入到公式中,可得下一轮样本权重的更新公式(注意:这是未归一化的权重):

我们让两者都乘以相同的常数 \( \exp\left(\frac{K-1}{K}\,\alpha_m\right) \),则可得:

这个公式表示:当前弱学习器预测正确样本,则样本权重不调整。当预测错误,则样本权重提升。最后,对所有样本的权重进行归一化,即可得到下一轮训练的样本权重。

3. 计算案例

AdaBoost 核心思想是关注错误样本、动态调整权重。每轮训练后,提高被当前弱学习器误分类样本的权重,让后续弱学习器更聚焦于这些难分样本。同时,根据弱学习器的分类精度,为其分配不同权重(精度越高,权重越大),最终通过加权投票得到强学习器。

接下来,以具体案例为核心,拆解完整训练过程,帮助大家理解自适应权重调整的本质。我们采用10 个样本的 3 分类任务,数据如下表所示。特征仅 1 个,类别分为 0、1、2,任务是训练多个弱决策树,实现对样本的分类。

样本编号特征 X真实类别
11.00
21.50
32.00
43.01
53.51
64.01
75.02
85.52
96.02
103.81

AdaBoost(SAMME)的训练过程可以总结为以下步骤:

  1. 初始化:样本权重 = 1/N
  2. 训练弱决策树(树桩)
  3. 计算弱学习器错误率
  4. 计算弱学习器的权重
  5. 更新下轮样本的权重
  6. 循环 2-5 步,直到达到停止的条件

3.1 模型起步

训练开始前,因为我们对样本难分程度无先验认知,所以样本的权重均等。样本总数为 10,故每个样本的初始权重为 0.1。

样本编号特征 X真实标签初始权重
11.000.1
21.500.1
32.000.1
43.010.1
53.510.1
64.010.1
75.020.1
85.520.1
96.020.1
103.810.1

3.2 首次训练

我们基于这些带权重的样本训练第一个弱决策树,核心是找一个切分点。在 scikit-learn 1.7.2 中决策树的构建默认使用 gini 分裂增益计算方法。我们以 4.5 为例,将训练集分为两部分:

样本编号特征 X真实标签初始权重
11.000.1
21.500.1
32.000.1
43.010.1
53.510.1
64.010.1
75.020.1
85.520.1
96.020.1
103.810.1

接下来计算该分裂的分类增益:

基尼不纯度计算方法:https://mengbaoliang.cn/archives/84678/

我们按照相同的方法,计算所有候选切分点的加权基尼不纯度,选择值最小的点进行此次分裂。

接下来,基于下面的公式计算模型的错误率。错误样本共 3 个,其权重和为 0.1+0.1+0.1=0.3,所以该模型的错误率为:0.3

样本编号特征 X真实标签初始权重预测标签
11.000.11 – ×
21.500.11 – ×
32.000.11 – ×
43.010.11 – √
53.510.11 – √
64.010.11 – √
75.020.12- √
85.520.12- √
96.020.12- √
103.810.11- √

在前面公式推导的时候,我们并没有引入学习率的概念。在 AdaBoost 中,学习率用于控制单个弱分类器权重贡献程度,它决定了弱分类器对最终模型的影响幅度。

  • η 越小,单个弱分类器的权重越低,模型收敛越慢,但可能更稳定
  • η 越大,单个弱分类器的权重越高,模型收敛越快,但容易过拟合

如果没有学习率,假设模型受到异常、噪声的影响,导致某个模型话语权太大, 一旦它判断失误,对最终结果影响太大了。

我们在计算模型权重时,已经把学习率作用到模型的权重的计算中(\( \eta=0.3、K=3、err_{t}=0.3 \)):

最终计算得到第一个弱学习器的权重为:0.4621注意:学习率直接计算到模型权重上了。

接着,更新样本的权重。如果之前对该样本预测错误,则提高样本权重,否则权重不变。然后重新归一化,得到第二轮迭代需要的样本权重。

计算举例:

  • 1号样本预测错误,则其权重为:\( 0.1 \times \exp(0.4621) = 0.15874 \)
  • 4号样本预测正确,则其权重为:\( 0.1 \times \exp(0) = 0.1 \)

以此类推,计算所有样本新的权重,然后再归一化,如下图所示:

样本编号特征 X真实类别预测类别更新权重分数归一化权重
11.001 – ×0.158750.13496
21.501 – ×0.158750.13496
32.001 – ×0.158750.13496
43.011 – √0.10.08502
53.511 – √0.10.08502
64.011 – √0.10.08502
75.022- √0.10.08502
85.522- √0.10.08502
96.022- √0.10.08502
103.811 – √0.10.08502

我们会发现:样本权重的更新依赖模型权重,而学习率已经作用到模型权重中,相当于间接影响了样本权重的计算。较大的学习率,模型的权重较大,误分类样本权重会较大幅度调整,反之,样本的权重调整幅度较小,模型的训练过程也相对保守一些。

3.3 持续优化

基于新的样本权重权重训练第二个弱学习器:

计算当前弱学习器的错误率,错误的样本为 7、8、9,其权重和为:\( 0.08502 + 0.08502 + 0.08502 = 0.25506 \)

样本编号特征 X真实标签归一化权重预测标签
11.000.134960 – √
21.500.134960 – √
32.000.134960 – √
43.010.085021 – √
53.510.085021 – √
64.010.085021 – √
75.020.085021 – ×
85.520.085021 – ×
96.020.085021 – ×
103.810.085021 – √

接着计算当前弱学习器的权重(0.5295):

最后,更新样本权重(省略计算过程),循环迭代构建多个弱学习器。

当满足以下条件时,停止训练:

  • 当构建的弱学习器数量达到指定的数量,停止训练
  • 当构建的弱学习器错误率为 0 时,已经能够正确区分所有样本,停止训练
  • 当弱学习器的错误率高于随机猜测的错误率 \(1-1/K\) 时,模型的权重是负值,那么样本的权重在更新时,分类错误样本权重会降低,分类正确的样本权重会上升,这使得继续训练会产生更大的错误,所以停止训练。

未经允许不得转载:一亩三分地 » AdaBoost 多分类原理 + 公式推导 + 案例演示
评论 (0)

5 + 8 =