271 lines
11 KiB
Markdown
271 lines
11 KiB
Markdown
# 第七章
|
||
|
||
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 抽出来的一份数据练。这种“集体智慧”能极大地降低过拟合。
|