SilverIce Toolbox
Back to course

Stage 2 / Chapter 8

第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,00060 : 20 : 20数据少,每集都需要足够样本
1,000 ~ 10,00070 : 15 : 15标准划分
10,000 ~ 100,00080 : 10 : 10数据多,验证集不需要太大
100,000+98 : 1 : 1大数据时代,验证/测试各 1% 已足够
现代大模型(如 GPT、LLaMA)的训练数据达 TB 级别,验证集和测试集可能只有几千条,但已足够统计显著。

致命错误:在测试集上调参

如果你用测试集准确率来选择模型,你实际上已经把测试集"泄露"给了训练过程。最终报告的性能会被高估,模型在真实环境中表现会差于预期。

交叉验证(Cross-Validation)

当数据量 < 1000 时,K-Fold 交叉验证更可靠:

K=5: 把数据分成 5 份,轮流用 4 份训练、1 份验证,取平均

English Explanation

DatasetPurposeTimes UsedKey Rule
TrainingLearn parametersManyMajority of data
ValidationTune hyperparametersManyNever touch test set
TestFinal evaluation, use ONCE1Evaluate 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 ErrorVal ErrorDiagnosisCause
HighHighHigh bias (underfitting)Model too simple
LowHighHigh variance (overfitting)Model too complex
LowLowJust rightGood 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:

  1. Evaluate training error
  2. If high → high bias → bigger model / less regularization
  3. If low → evaluate validation error
  4. If high → high variance → regularization / more data / early stopping
  5. 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

  1. 偏差方差实验:在 y = sin(x) 数据上,分别用 degree=1, 3, 15 的多项式回归。画出学习曲线,标注三种情况的诊断结论。
  1. 数据量实验:固定模型为 degree=15 多项式,分别用 m=20, 50, 100, 500 的数据训练。观察过拟合程度随数据量的变化。
  1. 交叉验证实现:不用 sklearn,手写 5-Fold 交叉验证。在相同数据上对比单划分 vs 交叉验证的验证误差稳定性。
  1. 早停诊断:训练一个神经网络,每 epoch 记录训练和验证损失。画出曲线,标出最优早停点。
  1. 真实项目诊断:假设你有一个图像分类项目,训练准确率 99%,验证准确率 72%。列出至少 5 种可能的原因和对应的验证方法。