Files
Notes/【笔记origin】ESL/7 origin.md
2026-05-16 17:16:51 +08:00

11 KiB
Raw Permalink Blame History

第七章

Bias - Variance => Generalization

这四个概念是 ESL 第七章中用于“惩罚”模型复杂度、从训练误差推导泛化误差的核心工具。我们可以把它们看作四套不同的“裁判标准”用来判断一个模型是否过度拟合Overfitting


1. AIC (Akaike Information Criterion)

AIC 的核心逻辑是:模型越复杂,在训练集上表现越好是理所应当的,所以我们要根据参数数量进行“扣分”。

  • 公式: AIC = -2 \cdot \log L + 2d

    • $\log L$:对数似然(模型对数据的拟合程度)。

    • $d$:模型的参数数量(复杂度)。

  • 直观理解: 如果你为了提高一点点准确度而增加了很多参数AIC 就会变大(变差)。

  • 适用场景: 它是对样本内误差的一个渐近无偏估计。如果你追求的是预测精度AIC 通常表现不错。


2. BIC (Bayesian Information Criterion)

虽然长得和 AIC 很像,但 BIC 的出发点是贝叶斯概率,它比 AIC “下手更狠”。

  • 公式: BIC = -2 \cdot \log L + (\log N) \cdot d

    • $N$:样本量。
  • 与 AIC 的区别:

    • AIC 的惩罚项是 $2d$,而 BIC 是 $(\log N)d$。

    • 只要样本量 $N > e^2 \approx 7.4$BIC 对复杂度的惩罚就比 AIC 更重。

  • 直观理解: BIC 极其不喜欢复杂的模型。随着数据量增加BIC 能够以概率 1 选中那个“真实”的简单模型。


3. MDL (Minimum Description Length最小描述长度)

这是一个从信息论(编码)角度看问题的天才视角。它认为:学习本质上就是对数据进行压缩。

  • 核心逻辑: 想象你要把数据发给别人。你有两个东西要发:

    1. 模型本身(比如回归系数)。

    2. 模型没解释掉的残差Error

  • 计算: $描述长度 = 描述模型的比特数 + 描述残差的比特数$。

  • 结论: 最好的模型就是能用最少的总长度把数据讲清楚的那个。

  • 与 BIC 的联系: 在数学推导上MDL 最终的形式往往和 BIC 是等价的。


4. VC 维 (Vapnik-Chervonenkis Dimension)

前三个工具主要针对线性模型或似然框架,而 VC 维是 SLT统计学习理论 的基石,它更通用,但也更难算。

  • 定义: 它衡量一个函数族模型能“打散Shatter”多少个点的能力。

    • 比如,二维平面上的直线最多能把 3 个点(非共线)的所有 2^3=8 种标签组合完美分开,但分不开某些 4 个点的组合。所以直线的 VC 维是 3。
  • 作用: 它是为了求出泛化误差的上界

    • Err_{out} \le Err_{train} + \text{Penalty}(VC, N)
  • 直观理解: 它不依赖于数据分布。它告诉我们如果模型的“潜力”VC维太强而数据量 N 太少,那么模型极度危险,一定会过拟合。


总结对比

工具 核心逻辑 惩罚力度 适用场景
AIC 预测导向 较轻 追求最高预测精度
BIC 解释导向 较重 寻找真实、简洁的模型
MDL 压缩导向 与 BIC 类似 站在信息论高度统一看待
VC 维 潜力导向 最保守 理论证明,不依赖数据分布

💡 学习建议:

如果你正在写代码实现模型选择:

  • AIC/BIC 最容易算,只要你有 Likelihood或 RSS和参数个数。

  • MDL 更多是提供一种直觉,工程中常转化为 BIC。

  • VC 维 很难针对复杂模型(如深层神经网络)算出精确值,通常作为理论分析的工具。

这四个概念里,哪一个的数学推导让你觉得最绕?(通常是 VC 维或 BIC 的拉普拉斯近似推导)

  • 交叉验证Cross-Validation, CV

它是目前工业界和学术界评估模型泛化能力(样本外表现)最通用的直接手段。如果说 AIC/BIC 是靠公式去“推测”误差,那么 CV 就是靠“模拟测试”来“实测”误差。

1. 核心思想:不相信“同一个人”

在机器学习中,如果我们用同一份数据训练模型又评估模型,这叫“自卖自夸”,结果必然偏乐观。

交叉验证的核心: 强行把数据切开,确保模型在评估时面对的是它从未见过的“陌生数据”。

2. 最经典的做法K-折交叉验证 (K-fold CV)

假设你有一组数据(比如 N=100 个样本),我们要进行 5-折交叉验证 ($K=5$)

  1. 分块:把数据随机打乱,平均分成 5 份(每份 20 个点)。

  2. 迭代:进行 5 轮实验。

    • 第一轮:用第 2, 3, 4, 5 份数据训练,用第 1 份数据测试。得到误差 $E_1$。

    • 第二轮:用第 1, 3, 4, 5 份数据训练,用第 2 份数据测试。得到误差 $E_2$。

    • ...以此类推。

  3. 汇总:最后把这 5 个误差取平均值:$CV_{(5)} = \frac{1}{5} \sum E_i$。

3. 为什么要费这么大劲CV 的意义)

A. 消除“运气”成分

如果你只做一次简单的训练集/测试集划分Hold-out万一你随机分出的测试集特别简单或者特别难评估结果就不准了。CV 通过轮转,让每一个数据点都既当过训练集,也当过测试集

B. 解决“样本不足”

如果你只有 100 个样本,分出 30% 做测试,你就只剩 70 个练模型,模型可能练不全;分出 10% 做测试测试结果又不具代表性。CV 让你在每一轮都能用到 80\% \sim 90\% 的数据来训练,同时覆盖了全样本的测试。

4. ESL 提到的“大坑”CV 的正确姿势

这是 ESL 第七章特别强调的,很多学生(甚至资深工程师)都会犯的错:预处理必须在 CV 循环内部做。

  • 错误做法:先对所有数据进行特征选择(比如选出相关性最高的 10 个变量),然后再跑 CV。

    • 结果由于特征选择时已经“偷看”了全样本的信息CV 结果会显著偏好Overfitting
  • 正确做法:先分块。在每一轮 CV 中,只根据训练块选特征,然后在测试块上验证。

5. 常见的变体

  • 留一法 (Leave-One-Out, LOOCV)

    • 令 $K = N$。每次只留一个点做测试。

    • 优点几乎没有偏差Bias 低),因为训练集和原始数据集几乎一样。

    • 缺点:计算量巨大;且由于每次训练集高度相似,导致的误差估计方差很高

  • 自助法 (Bootstrap)

    • 不是分块,而是从原始数据里“有放回地随机抽样”。

    • ESL 认为 Bootstrap 相比 CV 在某些小样本场景下更稳健,但计算更复杂。

6. 如何选择 $K$

在 ESL 中,作者给出了一个经验性的结论:

  • 通常选 K=5 $K=10$。

  • 理由:这是一个 Bias-Variance TradeoffK 太小(如 2偏差大训练数据太少模型没练好K 太大(如 $N$),虽然偏差小,但计算成本高,且估计值的方差大。

总结

交叉验证就像是程序员在写 Unit Test

  • 你不能只跑一次 main() 成功了就说没 Bug。

  • 你需要构造各种不同的输入组合Fold确保代码在各种边界条件下都能正确运行。

  • 类似RAID5


既然你已经理解了交叉验证CV那种“RAID 5 式的循环校验”,那么理解**自助法Bootstrap就会非常直观:它不再是死板地“分块”,而是通过“随机抽样”**来模拟出无数个虚拟的数据集。

在 ESL 第七章中Bootstrap 被视为另一种评估“预测误差”的利器,尤其在数据量较小时,它比 CV 更稳健。

1. 核心操作:有放回的随机抽样

假设你手头有 N=100 个原始样本。自助法的做法是:

  1. 抽样:从这 100 个样本中,**有放回地With Replacement**随机抽取 100 次。

  2. 生成:这样你会得到一个同样大小为 100 的自助样本集Bootstrap Sample

    • 关键点:由于是“有放回”的,有些原始样本会被重复抽到(平均出现 1.58 次),而有些样本则一次都没被抽到。
  3. 循环:重复上述过程 B 次(比如 $B=1000$),你就拥有了 1000 个略微不同的数据集。

  4. 评估:在每个数据集上训练模型,看它们表现的稳定性。

2. 那个神奇的数字0.632

在 Bootstrap 中,一个样本在 N 次抽取中从未被抽到的概率大约是:

(1 - \frac{1}{N})^N \approx \frac{1}{e} \approx 0.368

这意味着,平均而言,每个自助集只包含了约 63.2% 的原始数据,剩下的 36.8% 的数据对这个模型来说就是“从未见过的测试集”。

这部分没被抽到的数据被称为 Out-of-Bag (OOB) 数据。

3. 如何用 Bootstrap 估计误差?

ESL 讨论了两种评估方式,其中第二种最常用:

A. 基础 Bootstrap 估计

计算模型在各个自助集上的平均表现。但这样做有一个巨大的偏差Bias:因为训练集和测试集有重叠,它会像训练误差一样过于乐观。

B. Leave-One-Out Bootstrap (类似 CV)

为了解决重叠问题,我们只针对每个原始观察值 $i$,在那些没包含 i 的自助集中进行预测。这能得到一个更纯净的误差估计。

C. .632 估计器 (The .632 Estimator)

这是 ESL 第 7.11 节的精华。作者提出Bootstrap 的误差估计通常偏保守(因为训练集里只有 63.2% 的独特数据,模型没练够),而训练误差又太乐观。

于是他们搞了一个加权平均:

\text{Err}_{.632} = 0.368 \times \overline{\text{err}} + 0.632 \times \text{Err}^{(1)}

这个公式试图通过这两种极端的加权,找到最接近真实的泛化误差。

4. Bootstrap vs. 交叉验证 (CV)

虽然两者都通过重采样来评估模型,但侧重点不同:

  • CV (交叉验证)

    • 像是在**“模拟未来的考试”**。

    • 优点:对真实误差的估计通常比较准确(偏差低)。

    • 缺点:如果 K 选得不好,波动(方差)可能比较大。

  • Bootstrap (自助法)

    • 像是在**“模拟数据的分布”**。

    • 优点在样本量极小时表现极好估计值的方差Variance更小。

    • 缺点如上所述存在明显的偏差Bias需要像 .632 这样的修正系数来补救。

5. 程序员视角的总结

如果把 CV 比作 RAID 5那么 Bootstrap 就像是在做 “混沌工程” (Chaos Engineering)

你不是在按规则切分数据,而是通过不断的随机扰动(抽样),看看你的模型在面对稍微变样的数据分布时,到底有多坚固。

有趣的事实: 机器学习里著名的 随机森林 (Random Forest) 算法,其核心技术就是 BaggingBootstrap Aggregating。它训练成百上千棵树每棵树都用 Bootstrap 抽出来的一份数据练。这种“集体智慧”能极大地降低过拟合。