第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
中文解释
问题:多个指标如何选择?
假设你有两个分类器:
| 分类器 | 准确率 | 推理时间 |
|---|---|---|
| A | 95% | 100ms |
| B | 90% | 10ms |
无法直接比较。需要统一成一个指标:
解决方案
- 加权和:
Score = 准确率 - 0.001 × 推理时间 - 满足 + 优化:满足 推理时间 < 50ms,然后优化准确率
- 平均:
F1 = 2 × (Precision × Recall) / (Precision + Recall)
实际案例
| 指标组合 | 统一方式 |
|---|---|
| Precision + Recall | F1 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
中文解释
方法
- 在验证集上找出 100 个错误样本
- 人工分类错误原因
- 统计每种原因的占比
- 优先解决占比最高的问题
示例
假设验证错误率 10%(100 个错误):
| 错误原因 | 数量 | 占比 | 解决后验证误差 |
|---|---|---|---|
| 模糊/低分辨率 | 45 | 45% | 5.5% |
| 标签错误 | 25 | 25% | 7.5% |
| 遮挡 | 20 | 20% | 8.0% |
| 其他 | 10 | 10% | 9.0% |
策略:优先解决"模糊/低分辨率",潜在收益最大(从 10% → 5.5%)。
常见错误
- ❌ 均匀用力:每种错误都花同样时间
- ✅ 抓大头:先解决占比最高的问题
English Explanation
Error Analysis Steps:
- Collect 100 misclassified examples
- Categorize errors manually
- Count frequency of each category
- 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% | 数据不匹配! |
解决方案
- 人工合成数据:让训练数据更像验证数据
- 加噪声、模糊、裁剪 - 注意:不要只合成一小部分变化,否则模型会过拟合到这些合成特征
- 收集更多真实验证数据:最优但最昂贵
- 域适应(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 完整实现:误差分析模拟
代码案例
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
- 正交化设计:为一个推荐系统设计正交化的调参策略。列出至少 5 个可能的问题和对应的"单一控制旋钮"。
- 指标设计:设计一个"自动驾驶安全性"的单一评估指标,综合考虑:事故率、误刹车率、反应时间。
- 人类水平估计:对猫狗分类任务,假设人类准确率 98%。你的模型训练准确率 96%,验证准确率 92%。诊断问题并给出策略。
- 误差分析实操:在一个真实分类任务上(如 MNIST),人工检查 50 个错误样本,分类错误原因并排序。
- 数据不匹配诊断:假设训练集是白天照片,测试集是夜间照片。设计一个实验来量化数据不匹配的程度,并提出 3 种解决方案。