第8章:ML 实践建议与偏差方差 | Chapter 8: ML Practice & Bias-Variance
阶段定位 | Stage: 第二阶段 — 神经网络与进阶算法 预计学时 | Duration: 3~4 小时
---
学习目标 | Learning Objectives
中文:
- 建立系统化的模型诊断思维,不盲目调参
- 能用学习曲线判断高偏差还是高方差
- 掌握训练集/验证集/测试集的正确划分与使用规范
- 理解数据划分比例随数据量变化的规律
- 掌握解决高偏差和高方差的具体策略
English:
- Build systematic model diagnosis mindset instead of blind tuning
- Use learning curves to distinguish high bias from high variance
- Master correct usage of train/validation/test splits
- Understand how split ratios change with data volume
- Master concrete strategies for fixing high bias and high variance
---
8.1 数据划分规范 | Data Splitting Best Practices
中文解释
三集分工
| 数据集 | 用途 | 接触次数 | 关键规则 |
|---|---|---|---|
| 训练集 | 训练模型参数(权重) | 多次 | 占大部分数据 |
| 验证集 | 调超参、选模型、早停 | 多次 | 不能碰测试集 |
| 测试集 | 最终评估,只使用一次 | 1 次 | 调参后评估 |
划分比例
| 总数据量 | 训练 : 验证 : 测试 | 原因 |
|---|---|---|
| 100 ~ 1,000 | 60 : 20 : 20 | 数据少,每集都需要足够样本 |
| 1,000 ~ 10,000 | 70 : 15 : 15 | 标准划分 |
| 10,000 ~ 100,000 | 80 : 10 : 10 | 数据多,验证集不需要太大 |
| 100,000+ | 98 : 1 : 1 | 大数据时代,验证/测试各 1% 已足够 |
现代大模型(如 GPT、LLaMA)的训练数据达 TB 级别,验证集和测试集可能只有几千条,但已足够统计显著。
致命错误:在测试集上调参
如果你用测试集准确率来选择模型,你实际上已经把测试集"泄露"给了训练过程。最终报告的性能会被高估,模型在真实环境中表现会差于预期。
交叉验证(Cross-Validation)
当数据量 < 1000 时,K-Fold 交叉验证更可靠:
K=5: 把数据分成 5 份,轮流用 4 份训练、1 份验证,取平均English Explanation
| Dataset | Purpose | Times Used | Key Rule |
|---|---|---|---|
| Training | Learn parameters | Many | Majority of data |
| Validation | Tune hyperparameters | Many | Never touch test set |
| Test | Final evaluation, use ONCE | 1 | Evaluate after tuning |
Split Ratios by Data Volume:
- 100~1K samples: 60:20:20
- 1K~10K: 70:15:15
- 10K~100K: 80:10:10
- 100K+: 98:1:1
---
8.2 偏差 vs 方差诊断 | Bias vs Variance Diagnosis
中文解释
诊断矩阵
| 训练误差 | 验证误差 | 诊断 | 原因 |
|---|---|---|---|
| 高(如 30%) | 高(如 32%) | 高偏差(欠拟合) | 模型太简单 |
| 低(如 2%) | 高(如 18%) | 高方差(过拟合) | 模型太复杂 |
| 低(如 3%) | 低(如 5%) | 刚好 | 模型复杂度匹配 |
| 很低(如 0.5%) | 很高(如 25%) | 严重过拟合 | 模型记住了训练集 |
解决策略
高偏差(欠拟合):
- 增大模型(更多层/更多神经元)
- 训练更久
- 换更复杂的模型架构
- 减少正则化(减小 λ)
- 增加特征或使用更好的特征工程
高方差(过拟合):
- 更多训练数据
- 正则化(L1/L2、Dropout)
- 数据增强
- 简化模型(减少层/神经元)
- 早停(Early Stopping)
一个重要的直觉
增加数据量对高方差问题有效,但对高偏差问题无效:
- 高方差:模型记住了噪声 → 更多数据 → 噪声被"平均掉" → 泛化提升
- 高偏差:模型根本学不到规律 → 更多数据也没用 → 需要更复杂的模型
English Explanation
Diagnosis Matrix:
| Train Error | Val Error | Diagnosis | Cause |
|---|---|---|---|
| High | High | High bias (underfitting) | Model too simple |
| Low | High | High variance (overfitting) | Model too complex |
| Low | Low | Just right | Good match |
Fixing High Bias: bigger model, train longer, reduce regularization Fixing High Variance: more data, regularization, data augmentation, simpler model
---
8.3 学习曲线 | Learning Curves
中文解释
定义
学习曲线 = 训练误差和验证误差随训练集大小变化的曲线。
三种典型形状
高偏差(欠拟合):
误差
↑ ━━━━训练误差━━━━━━━━
30% ━━━━━━━━━验证误差━━━━
└────────────────────────→ 训练集大小
两条曲线都很高,且接近
高方差(过拟合):
误差
↑ ╱ 训练误差
5% ╱
╱
20% ━━━━━━━━━验证误差━━━━━
└────────────────────────→ 训练集大小
训练误差低,验证误差高,差距大
刚好:
误差
↑ ╱ 训练误差
5% ╱ ╲ 验证误差
╱ ╲
8% ━━━━━━━━━━━
└────────────────────────→ 训练集大小
两条曲线收敛,差距小关键洞察
- 如果增加数据量后,验证误差继续下降 → 高方差,应该继续收集数据
- 如果增加数据量后,验证误差不再下降 → 高偏差,需要更复杂的模型
English Explanation
Three Typical Shapes:
- High bias: both curves high and close together
- High variance: train error low, val error high, large gap
- Just right: both curves converge with small gap
Key Insight:
- If val error keeps decreasing with more data → high variance, collect more
- If val error plateaus → high bias, need more complex model
---
8.4 完整实现:学习曲线可视化
代码案例
python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import learning_curve
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
np.random.seed(42)
# ========== 1. 生成非线性数据 ==========
m = 100
X = np.sort(np.random.rand(m, 1) * 6 - 3, axis=0)
y = np.sin(X).ravel() + np.random.randn(m) * 0.2
# ========== 2. 三种模型的学习曲线 ==========
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
def plot_learning_curve(ax, model, title):
train_sizes, train_scores, val_scores = learning_curve(
model, X, y, cv=5,
train_sizes=np.linspace(0.1, 1.0, 10),
scoring='neg_mean_squared_error'
)
train_mean = -np.mean(train_scores, axis=1)
val_mean = -np.mean(val_scores, axis=1)
ax.plot(train_sizes, train_mean, 'o-', label='Training Error', color='blue')
ax.plot(train_sizes, val_mean, 'o-', label='Validation Error', color='red')
ax.set_xlabel('Training Set Size')
ax.set_ylabel('MSE')
ax.set_title(title)
ax.legend()
ax.set_ylim(0, 1.5)
ax.grid(True, alpha=0.3)
# 高偏差:线性模型(欠拟合)
plot_learning_curve(axes[0], LinearRegression(), 'High Bias (Underfitting)')
# 高方差:15阶多项式(过拟合)
plot_learning_curve(axes[1],
make_pipeline(PolynomialFeatures(15), LinearRegression()),
'High Variance (Overfitting)')
# 刚好:3阶多项式
plot_learning_curve(axes[2],
make_pipeline(PolynomialFeatures(3), LinearRegression()),
'Just Right')
plt.tight_layout()
plt.savefig('ch08_learning_curves.png')
print("学习曲线已保存")
# ========== 3. 诊断要点总结 ==========
print("\n=== 诊断要点 ===")
print("高偏差: 训练误差和验证误差都很高,且接近")
print(" → 模型太简单,需要增大模型复杂度")
print("高方差: 训练误差低,验证误差高,差距大")
print(" → 模型太复杂,需要正则化或更多数据")
print("刚好: 两者都低且接近")
print(" → 模型复杂度匹配数据")典型输出分析:
高偏差图:两条曲线都维持在 MSE≈0.4,且几乎重合
高方差图:训练误差≈0.1,验证误差≈0.8,差距巨大
刚好图: 训练误差≈0.15,验证误差≈0.25,差距小且都较低---
8.5 系统调参流程 | Systematic Tuning Workflow
中文解释
诊断 → 行动 流程图
开始
│
▼
评估训练误差
│
├── 训练误差高? ──→ 高偏差 ──→ 增大模型 / 减少正则化 / 更多特征
│ │
│ ▼
│ 重新训练
│ │
└── 训练误差低? ──→ 评估验证误差
│
├── 验证误差高? ──→ 高方差 ──→ 正则化 / 更多数据 / 早停
│ │
│ ▼
│ 重新训练
│ │
└── 验证误差低? ──→ 测试集最终评估 ──→ 完成不要做的事:
- ❌ 同时调 10 个超参数
- ❌ 在测试集上选择模型
- ❌ 没有诊断就盲目增加层数
- ❌ 数据量 < 1000 时不使用交叉验证
English Explanation
Systematic Workflow:
- Evaluate training error
- If high → high bias → bigger model / less regularization
- If low → evaluate validation error
- If high → high variance → regularization / more data / early stopping
- If low → final test evaluation → done
---
本章总结 | Chapter Summary
中文:
- 训练集学参数,验证集调超参,测试集只评估一次
- 数据量越大,验证/测试集比例可以越小
- 高偏差 = 训练误差高 + 验证误差高 → 增大模型
- 高方差 = 训练误差低 + 验证误差高 → 正则化/更多数据
- 学习曲线是诊断工具:增加数据是否有效,一看便知
- 系统化调参:先诊断,再行动,不盲目
English:
- Train learns parameters, val tunes hyperparameters, test evaluates once
- Larger datasets → smaller val/test proportions
- High bias = high train + high val → bigger model
- High variance = low train + high val → regularization / more data
- Learning curves diagnose whether more data helps
- Systematic tuning: diagnose first, act second
---
课后练习 | Homework
- 偏差方差实验:在
y = sin(x)数据上,分别用 degree=1, 3, 15 的多项式回归。画出学习曲线,标注三种情况的诊断结论。
- 数据量实验:固定模型为 degree=15 多项式,分别用 m=20, 50, 100, 500 的数据训练。观察过拟合程度随数据量的变化。
- 交叉验证实现:不用 sklearn,手写 5-Fold 交叉验证。在相同数据上对比单划分 vs 交叉验证的验证误差稳定性。
- 早停诊断:训练一个神经网络,每 epoch 记录训练和验证损失。画出曲线,标出最优早停点。
- 真实项目诊断:假设你有一个图像分类项目,训练准确率 99%,验证准确率 72%。列出至少 5 种可能的原因和对应的验证方法。