Skip to content

数学原理

本章目标

  1. 理解 Bootstrap 抽样的概率基础——每个样本被选入训练子集的概率约为 63.2%。
  2. 理解 Bagging 为何能降低方差——通过并行训练多个不相关(或弱相关)模型并投票平均。
  3. 理解 OOB(Out-of-Bag)误差估计的数学原理——利用未参与训练的样本做无偏估计。
  4. 理解为什么 Bagging 选择完全生长的决策树(高方差低偏差)作为基学习器。

重点方法与概念速览

名称类型作用
Bootstrap 采样抽样方法N 个样本中有放回地抽取 m 个样本——每个子训练集约含 63.2% 的原始样本
方差缩减核心原理n 个方差均为 σ2、两两相关系数为 ρ 的模型取平均,集成方差为 ρσ2+(1ρ)σ2/n
投票聚合输出方式分类任务:n 个基学习器投票,多数票决定最终预测
OOB 误差评估指标用未参与训练的约 36.8% 样本评估每个基学习器——等价于交叉验证
n_estimators源码参数基学习器数量——越多方差越低,但边际收益递减
max_samples源码参数每个 Bootstrap 子集的样本比例——控制训练子集与原始数据的差异度

1. Bootstrap 抽样

给定 N 个样本的数据集 D={(x1,y1),,(xN,yN)},Bootstrap 抽样从中有放回地抽取 m 个样本,构成一个训练子集 Db

单个样本未被抽中的概率

每个样本在一次抽取中被选中的概率为 1/N,未被选中的概率为 11/Nm 次独立抽取后:

P(样本 i 未被抽中)=(11N)m

m=N 时(即子集大小等于原始数据大小),取极限:

limN(11N)N=1e0.368

理解重点

  • 每个 Bootstrap 子集约含原始数据中约 63.2% 的样本——剩余的约 36.8% 就是 OOB 样本。
  • 当前源码 max_samples=0.8 表示 m=0.8N——子集比原始数据稍小,进一步增加了子集间的差异性。
  • Bootstrap 采样的随机性使每个基学习器看到的数据分布略有不同——这是"模型多样性"的来源。

2. 方差缩减原理

独立模型的方差

n 个基学习器 f1,,fn,每个的预测方差均为 σ2,两两之间的相关系数为 ρ。Bagging 通过投票(分类)或平均(回归)聚合:

fbag(x)=1nb=1nfb(x)

集成模型的方差为:

Var[fbag]=1n2(b=1nVar[fb]+bcCov[fb,fc])=ρσ2+1ρnσ2

两种极端情况

  • ρ=1(完全相关——所有基学习器完全相同):Var[fbag]=σ2——Bagging 无帮助
  • ρ=0(完全不相关——基学习器完全独立):Var[fbag]=σ2/n——方差随 n 线性下降

实际情况下 0<ρ<1,Bagging 在方差缩减和基学习器多样性之间取得平衡。

理解重点

  • Bagging 降低方差,不降低偏差——集成模型的偏差约等于单个基学习器的偏差。
  • 这就是为什么 Bagging 选择完全生长的决策树max_depth=None)——它们偏差极低但方差极高,正是 Bagging 最受益的对象。
  • n_estimators=80 意味着理论上方差约缩减为 ρσ2+(1ρ)σ2/80——当 ρ 较小时,方差大幅下降。
  • 若基学习器本身偏差就很高(如浅层决策树),Bagging 无法纠正——低偏差是基学习器的必要前提。

3. OOB(Out-of-Bag)误差估计

对每个样本 (xi,yi),找到所有未使用该样本训练的基学习器 {b:(xi,yi)Db},仅用这些基学习器预测 y^iOOB,计算:

OOB Error=1Ni=1NI[yiy^iOOB]

等价地,OOB 得分:

OOB Score=1OOB Error

理解重点

  • OOB 误差等价于对每个样本做一次留出验证——无需额外划分验证集。
  • 与交叉验证不同,OOB 误差在训练过程中"免费"获得——不需要额外训练。
  • 当前源码 oob_score=True 启用此功能——model.oob_score_ 打印到 4 位小数。
  • OOB 得分可以直接作为模型泛化能力的参考——当它与测试集准确率接近时,说明模型泛化良好。

4. 为什么选择完全生长的决策树

Bagging 的方差缩减依赖于基学习器满足两个条件:

  1. 低偏差——基学习器必须能拟合训练数据(偏差小)
  2. 高方差——不同的训练子集应导致明显不同的模型(方差大)

完全生长的决策树(max_depth=None)完美满足这两个条件:

  • 能完美拟合训练数据(偏差 0
  • 对训练数据的微小变化极其敏感(方差极大)

理解重点

  • 如果使用浅层决策树或线性模型(低方差),Bagging 的方差缩减效果非常有限——因为没有方差可缩减。
  • 当前源码中的基学习器参数 max_depth=None, min_samples_split=2, min_samples_leaf=1——刻意让每棵树完全生长,最大化方差。
  • 这与 Boosting 形成对比——Boosting 通常使用浅层决策树(弱学习器),因为它的目标是降低偏差而非方差。

5. Bagging 与 Boosting 的数学对比

维度BaggingBoosting(如 GBDT)
训练方式并行——n 个模型独立训练串行——每个模型拟合前一个模型的残差
核心目标降低方差降低偏差
基学习器强学习器(低偏差高方差,如完全生长树)弱学习器(高偏差低方差,如浅层树)
样本权重等权重 Bootstrap 采样自适应加权——错分样本权重增大
模型权重等权重投票按模型性能加权
过拟合风险低——并行平均天然正则化较高——串行拟合可能过度追逐残差
标志性参数n_estimatorsmax_samplesn_estimatorslearning_ratemax_depth

理解重点

  • Bagging 和 Boosting 不是"谁更好"——Bagging 在基学习器过拟合时帮它"冷静下来"(降方差),Boosting 在基学习器欠拟合时帮它"变得更准"(降偏差)。
  • 当前高噪声双月牙数据 + 完全生长树是一个经典场景——单棵树严重过拟合(方差极大),Bagging 通过并行投票大幅改善。

6. 数学原理如何映射到当前源码

数学概念数学符号/公式代码实现
Bootstrap 采样P(未抽中)em/Nbootstrap=Truemax_samples=0.8
基学习器数nn_estimators=80
集成预测(分类)y^=majority{fb(x)}b=1nmodel.predict(X)
集成概率(分类)p^=1nbpbmodel.predict_proba(X)
OOB 得分11NiI[yiy^iOOB]model.oob_score_oob_score=True
基学习器fb:完全生长决策树DecisionTreeClassifier(max_depth=None, min_samples_split=2, min_samples_leaf=1)
方差缩减Var[fbag]=ρσ2+(1ρ)σ2/nBagging 核心机制
标准化zj=(xjμj)/σjStandardScaler(训练集拟合/测试集变换)
分层抽样保持类别比例train_test_split(stratify=y)

常见坑

  1. 混淆 Bagging 与 Boosting 的目标——Bagging 降方差(并行投票),Boosting 降偏差(串行纠错)。
  2. 把 Bagging 的基学习器设为低方差模型——方差缩减需要高方差基学习器。
  3. 忽略 OOB 得分的存在——它提供了"免费的"泛化能力估计,无需额外划分验证集。
  4. n_estimators 设得过小——n<10 时方差缩减效果有限。

小结

  • Bagging 的数学核心链:Bootstrap 采样(约 63.2% 样本被抽中)→ 并行训练 n 个高方差基学习器 → 投票/平均聚合 → 方差从 σ2 缩减到 ρσ2+(1ρ)σ2/n → OOB 误差提供无偏估计。
  • Bagging 降低方差而不降低偏差——因此需要低偏差高方差的基学习器(完全生长的决策树)。
  • 当前源码 BaggingClassifier(estimator=DecisionTreeClassifier(max_depth=None), n_estimators=80, max_samples=0.8, bootstrap=True, oob_score=True) 是针对高噪声双月牙数据最经典的 Bagging 配置。