【机器学习】(算法优化二)提升算法之:AdaBoost与随机梯度

文章目录

提升算法是集成学习中的另一重要分支,与装袋算法不同,提升算法通过顺序训练和权重调整,实现了与装袋算法不同的集成策略。AdaBoost通过自适应权重调整关注难分类样本,随机梯度提升通过梯度优化实现精确的损失函数最小化。

一、 AdaBoost:自适应提升算法

AdaBoost的核心思想是:通过调整样本权重,让后续模型专注于之前模型预测错误的样本。这种方法确保了每个基模型都能为集成贡献独特的价值。

1、AdaBoost数学原理详解

1.1、 目标函数

F ( x ) = ∑ t = 1 T α t h t ( x ) F(x) = \sum_{t=1}^{T} \alpha_t h_t(x) F(x)=t=1∑Tαtht(x)

这个公式表示:最终的预测是所有基模型预测的加权和

具体解释

  • F ( x ) F(x) F(x) 是最终的集成预测
  • h t ( x ) h_t(x) ht(x) 是第 t t t 个基模型(比如决策树)的预测
  • α t \alpha_t αt 是第 t t t 个模型的权重(重要性)
  • T T T 是基模型的总数量

举个例子

假设有3个基模型,预测结果分别是:

  • 模型1: h 1 ( x ) = 1 h_1(x) = 1 h1(x)=1,权重 α 1 = 0.5 \alpha_1 = 0.5 α1=0.5
  • 模型2: h 2 ( x ) = − 1 h_2(x) = -1 h2(x)=−1,权重 α 2 = 0.3 \alpha_2 = 0.3 α2=0.3
  • 模型3: h 3 ( x ) = 1 h_3(x) = 1 h3(x)=1,权重 α 3 = 0.2 \alpha_3 = 0.2 α3=0.2

那么最终预测为:
F ( x ) = 0.5 × 1 + 0.3 × ( − 1 ) + 0.2 × 1 = 0.4 F(x) = 0.5 \times 1 + 0.3 \times (-1) + 0.2 \times 1 = 0.4 F(x)=0.5×1+0.3×(−1)+0.2×1=0.4

1.2、 样本权重更新的逻辑

D t + 1 ( i ) = D t ( i ) exp ⁡ ( − α t y i h t ( x i ) ) Z t D_{t+1}(i) = \frac{D_t(i) \exp(-\alpha_t y_i h_t(x_i))}{Z_t} Dt+1(i)=ZtDt(i)exp(−αtyiht(xi))

这个公式表示:根据当前模型的预测结果调整样本权重

具体解释

  • D t ( i ) D_t(i) Dt(i) 是第 t t t 轮第 i i i 个样本的权重
  • y i y_i yi 是第 i i i 个样本的真实标签(1或-1)
  • h t ( x i ) h_t(x_i) ht(xi) 是第 t t t 个模型对第 i i i 个样本的预测
  • α t \alpha_t αt 是第 t t t 个模型的权重
  • Z t Z_t Zt 是归一化因子,确保权重和为1

关键理解

  • 如果 y i h t ( x i ) = 1 y_i h_t(x_i) = 1 yiht(xi)=1(预测正确),则 exp ⁡ ( − α t ) < 1 \exp(-\alpha_t) < 1 exp(−αt)<1,权重减小
  • 如果 y i h t ( x i ) = − 1 y_i h_t(x_i) = -1 yiht(xi)=−1(预测错误),则 exp ⁡ ( α t ) > 1 \exp(\alpha_t) > 1 exp(αt)>1,权重增大

举个例子

假设第1个模型权重 α 1 = 0.5 \alpha_1 = 0.5 α1=0.5,对某个样本的预测:

  • 如果预测正确: y i h 1 ( x i ) = 1 y_i h_1(x_i) = 1 yih1(xi)=1,权重变为原来的 exp ⁡ ( − 0.5 ) ≈ 0.61 \exp(-0.5) \approx 0.61 exp(−0.5)≈0.61 倍
  • 如果预测错误: y i h 1 ( x i ) = − 1 y_i h_1(x_i) = -1 yih1(xi)=−1,权重变为原来的 exp ⁡ ( 0.5 ) ≈ 1.65 \exp(0.5) \approx 1.65 exp(0.5)≈1.65 倍

1.3、 模型权重计算的含义

α t = 1 2 ln ⁡ ( 1 − ϵ t ϵ t ) \alpha_t = \frac{1}{2} \ln(\frac{1 - \epsilon_t}{\epsilon_t}) αt=21ln(ϵt1−ϵt)

这个公式表示:根据模型的错误率计算其权重

具体解释

  • ϵ t \epsilon_t ϵt 是第 t t t 个模型的加权错误率
  • α t \alpha_t αt 是第 t t t 个模型的权重

关键理解

  • 错误率越低,权重越大
  • 错误率越高,权重越小
  • 当错误率 = 0.5时,权重 = 0(没有贡献)

举个例子

  • 如果错误率 ϵ t = 0.1 \epsilon_t = 0.1 ϵt=0.1(很好),则 α t = 1 2 ln ⁡ ( 0.9 0.1 ) = 1.1 \alpha_t = \frac{1}{2} \ln(\frac{0.9}{0.1}) = 1.1 αt=21ln(0.10.9)=1.1(高权重)
  • 如果错误率 ϵ t = 0.4 \epsilon_t = 0.4 ϵt=0.4(一般),则 α t = 1 2 ln ⁡ ( 0.6 0.4 ) = 0.2 \alpha_t = \frac{1}{2} \ln(\frac{0.6}{0.4}) = 0.2 αt=21ln(0.40.6)=0.2(中等权重)
  • 如果错误率 ϵ t = 0.5 \epsilon_t = 0.5 ϵt=0.5(随机),则 α t = 0 \alpha_t = 0 αt=0(无贡献)

1.4、 AdaBoost的核心思想

设计思路

  1. 样本权重更新:让后续模型更关注之前预测错误的样本
  2. 模型权重计算:让表现好的模型在最终预测中有更大话语权
  3. 顺序训练:每个新模型都试图纠正之前模型的错误

整体流程

  1. 训练第1个模型,计算错误率和权重
  2. 根据预测结果调整样本权重(错误样本权重增大)
  3. 训练第2个模型(更关注权重大的样本)
  4. 重复这个过程,直到训练完所有模型
  5. 最终预测是所有模型预测的加权和

这就是AdaBoost如何通过"让每个模型专注于之前模型预测错误的样本"来实现强大集成效果的原理。

2、为什么AdaBoost如此有效?

AdaBoost的有效性可以从多个角度理解。从统计学角度看,AdaBoost通过调整样本权重 ,让每个基模型专注不同的数据子集,从而实现了比简单平均更强的集成效果。

从机器学习角度看,AdaBoost的自适应特性使得它能够自动识别和关注难分类的样本,这种机制确保了模型在复杂数据上的强大表现。

二、 随机梯度提升算法:梯度优化下更精细的优化

随机梯度提升算法的核心思想是:通过梯度下降的方式顺序训练基模型,每个新模型都试图纠正之前模型的残差。这种方法实现了比AdaBoost更精细的损失函数优化。

1、随机梯度提升算法:残差驱动的梯度优化

1.1、核心目标函数

随机梯度提升算法的目标函数为:

F ( x ) = ∑ t = 1 T f t ( x ) F(x) = \sum_{t=1}^{T} f_t(x) F(x)=t=1∑Tft(x)

这个公式表示:最终的预测是所有基模型预测的简单累加

具体解释

  • F ( x ) F(x) F(x) 是最终的集成预测
  • f t ( x ) f_t(x) ft(x) 是第 t t t 个基模型(通常是决策树)的预测
  • T T T 是基模型的总数量

与AdaBoost的区别

  • AdaBoost: F ( x ) = ∑ t = 1 T α t h t ( x ) F(x) = \sum_{t=1}^{T} \alpha_t h_t(x) F(x)=∑t=1Tαtht(x)(加权和)
  • 随机梯度提升: F ( x ) = ∑ t = 1 T f t ( x ) F(x) = \sum_{t=1}^{T} f_t(x) F(x)=∑t=1Tft(x)(简单累加)

1.2、残差驱动的训练过程

残差的本质:模型错误的量化

残差就是当前模型预测与真实值之间的差距,它量化了模型预测错误的程度。

数学定义
残差 = 真实值 − 当前预测值 残差 = 真实值 - 当前预测值 残差=真实值−当前预测值

步骤1:计算负梯度(残差)

r t i = − ∂ L ( y i , F t − 1 ( x i ) ) ∂ F t − 1 ( x i ) r_{ti} = -\frac{\partial L(y_i, F_{t-1}(x_i))}{\partial F_{t-1}(x_i)} rti=−∂Ft−1(xi)∂L(yi,Ft−1(xi))

这个公式表示:计算当前模型预测与真实值之间的"残差"

具体解释

  • L ( y i , F t − 1 ( x i ) ) L(y_i, F_{t-1}(x_i)) L(yi,Ft−1(xi)) 是损失函数(如均方误差)
  • ∂ L ∂ F t − 1 ( x i ) \frac{\partial L}{\partial F_{t-1}(x_i)} ∂Ft−1(xi)∂L 是损失函数对预测的导数
  • 负号表示我们要沿着梯度的反方向优化

对于均方误差损失
L ( y , F ) = ( y − F ) 2 L(y, F) = (y - F)^2 L(y,F)=(y−F)2
∂ L ∂ F = 2 ( F − y ) \frac{\partial L}{\partial F} = 2(F - y) ∂F∂L=2(F−y)
− ∂ L ∂ F = 2 ( y − F ) = 2 × 残差 -\frac{\partial L}{\partial F} = 2(y - F) = 2 \times 残差 −∂F∂L=2(y−F)=2×残差

所以负梯度就是残差的倍数

举个例子

假设真实值 y i = 5 y_i = 5 yi=5,当前预测 F t − 1 ( x i ) = 3 F_{t-1}(x_i) = 3 Ft−1(xi)=3

  • 残差: 5 − 3 = 2 5 - 3 = 2 5−3=2
  • 负梯度: r t i = 2 × 2 = 4 r_{ti} = 2 \times 2 = 4 rti=2×2=4

这意味着我们需要增加预测值来减少损失。

步骤2:模型对残差进行优化

训练基模型 f t ( x ) f_t(x) ft(x) 来拟合残差 r t i r_{ti} rti

核心思想每个新模型的任务就是预测之前模型的残差

这就像接力赛跑:

  • 第1个选手跑了80米(模型1的预测)
  • 还剩下20米(残差)
  • 第2个选手的任务就是跑这剩下的20米(预测残差)

具体例子

假设我们要预测房价,真实房价是100万:

第1轮训练

  • 真实值: y = 100 y = 100 y=100万
  • 模型1预测: F 1 ( x ) = 80 F_1(x) = 80 F1(x)=80万
  • 残差: r 1 = 100 − 80 = 20 r_1 = 100 - 80 = 20 r1=100−80=20万

第2轮训练

  • 新目标:预测残差20万
  • 模型2预测: f 2 ( x ) = 15 f_2(x) = 15 f2(x)=15万
  • 更新预测: F 2 ( x ) = 80 + 15 = 95 F_2(x) = 80 + 15 = 95 F2(x)=80+15=95万
  • 新残差: r 2 = 100 − 95 = 5 r_2 = 100 - 95 = 5 r2=100−95=5万

第3轮训练

  • 新目标:预测残差5万
  • 模型3预测: f 3 ( x ) = 4 f_3(x) = 4 f3(x)=4万
  • 更新预测: F 3 ( x ) = 95 + 4 = 99 F_3(x) = 95 + 4 = 99 F3(x)=95+4=99万
  • 新残差: r 3 = 100 − 99 = 1 r_3 = 100 - 99 = 1 r3=100−99=1万
步骤3:更新预测

F t ( x ) = F t − 1 ( x ) + η f t ( x ) F_t(x) = F_{t-1}(x) + \eta f_t(x) Ft(x)=Ft−1(x)+ηft(x)

这个公式表示:将新模型的预测加到之前的预测上

具体解释

  • F t − 1 ( x ) F_{t-1}(x) Ft−1(x) 是之前所有模型的累积预测
  • f t ( x ) f_t(x) ft(x) 是第 t t t 个新模型的预测
  • η \eta η 是学习率,控制新模型的贡献大小

学习率的作用

  • η = 1 \eta = 1 η=1:新模型完全贡献其预测
  • η = 0.1 \eta = 0.1 η=0.1:新模型只贡献10%的预测
  • 较小的学习率通常能获得更好的泛化性能

1.3、为什么用残差而不是直接预测?

避免重复学习

如果每个模型都直接预测原始目标,它们可能会学习到相似的模式,导致冗余。

用残差的优势

  • 模型1学习:房价的基本模式
  • 模型2学习:模型1遗漏的模式
  • 模型3学习:模型1和2都遗漏的模式
逐步精细化

残差通常比原始目标更容易预测,因为:

  • 残差的数值范围更小
  • 残差的模式更简单
  • 每个新模型只需要关注"遗漏"的部分

1.4、随机性的双重作用

样本随机性

每个基模型使用随机采样的数据子集进行训练。

具体实现

  • 从原始训练集中随机选择一部分样本
  • 通常选择80%的样本
  • 每个基模型使用不同的随机样本子集

作用

  • 增加基模型间的差异性
  • 防止过拟合、提高模型的泛化能力
特征随机性

每个基模型使用随机选择的特征子集。

具体实现

  • 从所有特征中随机选择一部分特征
  • 通常选择 p \sqrt{p} p 个特征( p p p 是特征总数)
  • 每个基模型使用不同的随机特征子集

作用

  • 进一步增加基模型间的差异性
  • 处理高维数据
  • 提高模型的鲁棒性

1.5、随机梯度提升的核心思想

为什么这样设计?

  1. 残差驱动:通过预测残差,每个新模型都专注于不同的错误模式
  2. 梯度优化:通过梯度信息指导模型训练,比AdaBoost的权重调整更精确
  3. 随机性:通过随机采样确保基模型间的差异性
  4. 学习率控制:通过较小的学习率防止过拟合

整体流程

  1. 初始化模型 F 0 ( x ) = 0 F_0(x) = 0 F0(x)=0
  2. 对于每一轮 t = 1 , 2 , . . . , T t = 1, 2, ..., T t=1,2,...,T:
    • 计算残差(负梯度)
    • 训练新模型拟合残差
    • 更新累积预测
  3. 最终预测是所有模型预测的累加

2、为什么随机梯度提升如此强大?

随机梯度提升的强大之处在于它结合了梯度优化的精确性和随机性的多样性。从优化角度看,随机梯度提升通过梯度下降实现了对损失函数的精确优化,这比AdaBoost的权重调整更加精细。

从集成角度看,随机梯度提升的随机性确保了基模型间的差异性,同时梯度优化确保了每个基模型都能为集成贡献最大价值。

更重要的是,随机梯度提升具有强大的泛化能力,通过控制学习率和基模型复杂度,可以有效防止过拟合。

三、 提升算法与装袋算法的对比

1、训练方式的差异

特性 装袋算法 提升算法
训练方式 并行训练 顺序训练
样本权重 固定 动态调整
基模型独立性
过拟合风险 中等

2、数学原理的差异

装袋算法 :通过平均独立训练的模型减少方差
V a r ( f ^ b a g ( x ) ) = σ 2 B + B − 1 B ρ σ 2 Var(\hat{f}_{bag}(x)) = \frac{\sigma^2}{B} + \frac{B-1}{B} \rho \sigma^2 Var(f^bag(x))=Bσ2+BB−1ρσ2

提升算法 :通过顺序优化减少偏差
F ( x ) = ∑ t = 1 T α t h t ( x ) 或 F ( x ) = ∑ t = 1 T f t ( x ) F(x) = \sum_{t=1}^{T} \alpha_t h_t(x) \quad \text{或} \quad F(x) = \sum_{t=1}^{T} f_t(x) F(x)=t=1∑Tαtht(x)或F(x)=t=1∑Tft(x)