SilverIce Toolbox
Back to course

Stage 4 / Chapter 15

第15章:ML 项目策略 | Chapter 15: ML Project Strategy

阶段定位 | Stage: 第四阶段 — ML 策略与 CNN 预计学时 | Duration: 3~4 小时

---

学习目标 | Learning Objectives

中文:

  • 掌握正交化思想:每个控制只调一个维度
  • 能用单一评估指标统一优化目标
  • 理解人类水平性能与可避免偏差/方差的关系
  • 掌握误差分析的系统方法
  • 能诊断并解决数据不匹配问题

English:

  • Master orthogonalization: each control adjusts one dimension
  • Unify optimization goals with a single evaluation metric
  • Understand human-level performance and avoidable bias/variance
  • Master systematic error analysis methodology
  • Diagnose and solve data mismatch problems

---

15.1 正交化 | Orthogonalization

中文解释

核心思想

每个"控制旋钮"应该只影响一个维度:

问题调节旋钮不要做的事
训练集拟合不好更大的网络 / Adam / 训练更久同时加正则化
验证集拟合不好正则化 / 更多数据同时换更复杂的模型
测试集拟合不好更大的验证集用测试集调参
实际表现不好换数据分布 / 换损失函数继续调超参

反例:早停(Early Stopping)

早停同时影响两个维度:

  • 拟合训练集(停止早了 → 训练误差高)
  • 拟合验证集(停止早了 → 防止过拟合)

虽然实用,但不够"正交"。正交的做法是:

  • 用更大的网络 + 不加正则化 → 拟合训练集
  • 用 L2 / Dropout → 拟合验证集

English Explanation

Orthogonal Controls: | Problem | Control | Don't Do | |---------|---------|----------| | Poor training fit | Bigger network / Adam | Add regularization simultaneously | | Poor validation fit | Regularization / more data | Make model more complex | | Poor test fit | Bigger validation set | Tune on test set | | Poor real-world | Change data distribution / loss | Keep tuning hyperparameters |

---

15.2 单一评估指标 | Single Evaluation Metric

中文解释

问题:多个指标如何选择?

假设你有两个分类器:

分类器准确率推理时间
A95%100ms
B90%10ms

无法直接比较。需要统一成一个指标:

解决方案

  1. 加权和Score = 准确率 - 0.001 × 推理时间
  2. 满足 + 优化:满足 推理时间 < 50ms,然后优化准确率
  3. 平均F1 = 2 × (Precision × Recall) / (Precision + Recall)

实际案例

指标组合统一方式
Precision + RecallF1 Score
多个类别的准确率平均准确率 / 加权平均
准确率 + 公平性加权分数(含公平性惩罚项)

English Explanation

Unifying metrics:

  • Weighted sum
  • Satisficing + optimizing
  • Averaging (F1 = harmonic mean of precision and recall)

---

15.3 人类水平性能与贝叶斯最优 | Human-Level & Bayes Optimal

中文解释

贝叶斯最优误差

理论上可能达到的最低误差(无论多好的模型)。通常用人类水平性能来估计。

误差类型定义解决策略
可避免偏差训练误差 - 人类水平更大的模型、训练更久
方差验证误差 - 训练误差正则化、更多数据
数据不匹配验证误差 - 同分布测试误差收集更多验证集类似数据

关键公式

可避免偏差 = 训练误差 - 人类水平误差
方差 = 验证误差 - 训练误差

例子

场景人类水平训练误差验证误差诊断策略
图像分类1%8%10%高可避免偏差更大的 CNN
图像分类1%2%10%高方差更多数据 + Dropout
语音识别5%6%12%两者都有更大模型 + 更多数据

English Explanation

Key formulas:

Avoidable bias = Training error - Human-level error
Variance = Validation error - Training error

---

15.4 误差分析 | Error Analysis

中文解释

方法

  1. 在验证集上找出 100 个错误样本
  2. 人工分类错误原因
  3. 统计每种原因的占比
  4. 优先解决占比最高的问题

示例

假设验证错误率 10%(100 个错误):

错误原因数量占比解决后验证误差
模糊/低分辨率4545%5.5%
标签错误2525%7.5%
遮挡2020%8.0%
其他1010%9.0%

策略:优先解决"模糊/低分辨率",潜在收益最大(从 10% → 5.5%)。

常见错误

  • ❌ 均匀用力:每种错误都花同样时间
  • ✅ 抓大头:先解决占比最高的问题

English Explanation

Error Analysis Steps:

  1. Collect 100 misclassified examples
  2. Categorize errors manually
  3. Count frequency of each category
  4. Prioritize the highest-impact fix

Strategy: Fix the biggest category first for maximum impact.

---

15.5 数据不匹配 | Data Mismatch

中文解释

问题

训练集和验证/测试集来自不同分布

训练集:网上下载的高清图片(100万张)
验证集:用户手机拍摄的模糊图片(1万张)

训练准确率 99%,验证准确率 70% —— 这不是过拟合,是数据不匹配!

诊断

创建训练-验证集(与训练集同分布,从训练数据中划分):

数据集误差诊断
训练集1%
训练-验证集2%方差小
验证集15%数据不匹配!

解决方案

  1. 人工合成数据:让训练数据更像验证数据

- 加噪声、模糊、裁剪 - 注意:不要只合成一小部分变化,否则模型会过拟合到这些合成特征

  1. 收集更多真实验证数据:最优但最昂贵
  1. 域适应(Domain Adaptation):专门的技术让模型适应新分布

English Explanation

Diagnosis: Create "train-dev" set (same distribution as training):

  • Train error: 1%
  • Train-dev error: 2% → low variance
  • Dev error: 15% → data mismatch!

Solutions: data synthesis, collect real data, domain adaptation

---

15.6 完整实现:误差分析模拟

代码案例

python
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

np.random.seed(42)

# ========== 1. 模拟分类任务 ==========
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

# 基线模型
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
val_acc = model.score(X_val, y_val)
print(f"验证集准确率: {val_acc:.4f}")
print(f"验证集错误率: {1-val_acc:.2%}")

# ========== 2. 误差分析 ==========
n_errors = int((1 - val_acc) * len(y_val))

# 模拟错误原因分类(实际项目中需要人工标注)
np.random.seed(1)
error_reasons = {
    '模糊边界样本': int(n_errors * 0.45),
    '噪声标签': int(n_errors * 0.25),
    '特征缺失': int(n_errors * 0.20),
    '其他': int(n_errors * 0.10),
}

print("\n" + "=" * 50)
print("误差分析(模拟 100 个错误样本)")
print("=" * 50)
total = sum(error_reasons.values())
for reason, count in sorted(error_reasons.items(), key=lambda x: -x[1]):
    pct = count / total * 100
    bar = "█" * int(pct / 3)
    print(f"{reason:12s}: {count:3d} ({pct:5.1f}%) {bar}")

print("\n" + "=" * 50)
print("改进策略")
print("=" * 50)
print("1. 优先解决 '模糊边界样本' (45%) — 潜在收益最大")
print("   方案:收集更多边界样本,或换更复杂模型")
print("2. 其次解决 '噪声标签' (25%)")
print("   方案:人工清洗标签")
print("3. 不要均匀用力!先解决大头")

# ========== 3. 正交化诊断 ==========
print("\n" + "=" * 50)
print("正交化诊断")
print("=" * 50)
train_acc = model.score(X_train, y_train)
human_level = 0.99  # 假设人类水平 99%

avoidable_bias = (1 - train_acc) - (1 - human_level)
variance = (1 - val_acc) - (1 - train_acc)

print(f"训练误差: {1-train_acc:.2%}")
print(f"人类水平: {1-human_level:.2%}")
print(f"验证误差: {1-val_acc:.2%}")
print(f"\n可避免偏差: {avoidable_bias:.2%}")
print(f"方差: {variance:.2%}")

if avoidable_bias > 0.05:
    print("\n→ 高可避免偏差:用更大的网络或训练更久")
elif variance > 0.05:
    print("\n→ 高方差:加正则化或更多数据")
else:
    print("\n→ 模型已很好")

输出:

验证集准确率: 0.9100
验证集错误率: 9.00%

==================================================
误差分析(模拟 100 个错误样本)
==================================================
模糊边界样本:  40 ( 44.4%) ███████████████
噪声标签:      22 ( 24.4%) ████████
特征缺失:      18 ( 20.0%) ██████
其他:           9 ( 10.0%) ███

==================================================
改进策略
==================================================
1. 优先解决 '模糊边界样本' (45%) — 潜在收益最大
   方案:收集更多边界样本,或换更复杂模型
2. 其次解决 '噪声标签' (25%)
   方案:人工清洗标签
3. 不要均匀用力!先解决大头

---

本章总结 | Chapter Summary

中文:

  • 正交化 = 每个控制只调一个维度
  • 单一评估指标统一优化目标(F1、加权分数)
  • 可避免偏差 = 训练误差 - 人类水平 → 增大模型
  • 方差 = 验证误差 - 训练误差 → 正则化/更多数据
  • 误差分析抓大头:统计错误原因,优先解决占比最高的
  • 数据不匹配 ≠ 过拟合,需要创建 train-dev 集诊断

English:

  • Orthogonalization: one control per dimension
  • Single metric unifies optimization (F1, weighted score)
  • Avoidable bias = train error - human level → bigger model
  • Variance = val error - train error → regularization / more data
  • Error analysis: categorize errors, fix the biggest category first
  • Data mismatch ≠ overfitting; diagnose with train-dev set

---

课后练习 | Homework

  1. 正交化设计:为一个推荐系统设计正交化的调参策略。列出至少 5 个可能的问题和对应的"单一控制旋钮"。
  1. 指标设计:设计一个"自动驾驶安全性"的单一评估指标,综合考虑:事故率、误刹车率、反应时间。
  1. 人类水平估计:对猫狗分类任务,假设人类准确率 98%。你的模型训练准确率 96%,验证准确率 92%。诊断问题并给出策略。
  1. 误差分析实操:在一个真实分类任务上(如 MNIST),人工检查 50 个错误样本,分类错误原因并排序。
  1. 数据不匹配诊断:假设训练集是白天照片,测试集是夜间照片。设计一个实验来量化数据不匹配的程度,并提出 3 种解决方案。