11 KiB
第七章
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,最小描述长度)
这是一个从信息论(编码)角度看问题的天才视角。它认为:学习本质上就是对数据进行压缩。
-
核心逻辑: 想象你要把数据发给别人。你有两个东西要发:
-
模型本身(比如回归系数)。
-
模型没解释掉的残差(Error)。
-
-
计算: $描述长度 = 描述模型的比特数 + 描述残差的比特数$。
-
结论: 最好的模型就是能用最少的总长度把数据讲清楚的那个。
-
与 BIC 的联系: 在数学推导上,MDL 最终的形式往往和 BIC 是等价的。
4. VC 维 (Vapnik-Chervonenkis Dimension)
前三个工具主要针对线性模型或似然框架,而 VC 维是 SLT(统计学习理论) 的基石,它更通用,但也更难算。
-
定义: 它衡量一个函数族(模型)能“打散(Shatter)”多少个点的能力。
- 比如,二维平面上的直线最多能把 3 个点(非共线)的所有
2^3=8种标签组合完美分开,但分不开某些 4 个点的组合。所以直线的 VC 维是 3。
- 比如,二维平面上的直线最多能把 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$):
-
分块:把数据随机打乱,平均分成 5 份(每份 20 个点)。
-
迭代:进行 5 轮实验。
-
第一轮:用第 2, 3, 4, 5 份数据训练,用第 1 份数据测试。得到误差 $E_1$。
-
第二轮:用第 1, 3, 4, 5 份数据训练,用第 2 份数据测试。得到误差 $E_2$。
-
...以此类推。
-
-
汇总:最后把这 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 Tradeoff。
K太小(如 2),偏差大(训练数据太少,模型没练好);K太大(如 $N$),虽然偏差小,但计算成本高,且估计值的方差大。
总结
交叉验证就像是程序员在写 Unit Test:
-
你不能只跑一次
main()成功了就说没 Bug。 -
你需要构造各种不同的输入组合(Fold),确保代码在各种边界条件下都能正确运行。
-
类似RAID5
既然你已经理解了交叉验证(CV)那种“RAID 5 式的循环校验”,那么理解**自助法(Bootstrap)就会非常直观:它不再是死板地“分块”,而是通过“随机抽样”**来模拟出无数个虚拟的数据集。
在 ESL 第七章中,Bootstrap 被视为另一种评估“预测误差”的利器,尤其在数据量较小时,它比 CV 更稳健。
1. 核心操作:有放回的随机抽样
假设你手头有 N=100 个原始样本。自助法的做法是:
-
抽样:从这 100 个样本中,**有放回地(With Replacement)**随机抽取 100 次。
-
生成:这样你会得到一个同样大小为 100 的自助样本集(Bootstrap Sample)。
- 关键点:由于是“有放回”的,有些原始样本会被重复抽到(平均出现 1.58 次),而有些样本则一次都没被抽到。
-
循环:重复上述过程
B次(比如 $B=1000$),你就拥有了 1000 个略微不同的数据集。 -
评估:在每个数据集上训练模型,看它们表现的稳定性。
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) 算法,其核心技术就是 Bagging(Bootstrap Aggregating)。它训练成百上千棵树,每棵树都用 Bootstrap 抽出来的一份数据练。这种“集体智慧”能极大地降低过拟合。