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

271 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第七章
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 Tradeoff**。$K$ 太小(如 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)** 算法,其核心技术就是 **Bagging**Bootstrap Aggregating。它训练成百上千棵树每棵树都用 Bootstrap 抽出来的一份数据练。这种“集体智慧”能极大地降低过拟合。