05 训练集、开发集、测试集划分(Train、Dev、Test Distributions)
05 训练集、开发集、测试集划分(Train、Dev、Test Distributions)
05 训练集、开发集、测试集划分(Train、Dev、Test Distributions)
🎯 一、核心思想:开发集与测试集必须来自同一分布
在构建机器学习系统时,开发集(Dev Set)和测试集(Test Set)的设立方式直接影响团队迭代效率。
关键原则:
开发集和测试集应来自相同的分布,并且该分布应代表你未来希望模型表现良好的真实应用场景。
❌ 错误做法示例
- 将不同区域(如美国、英国 vs. 印度、中国)的数据分别划入开发集和测试集。
- 开发集用中等收入邮政编码数据,测试集用低收入邮政编码数据。
这类做法导致:
- 模型在开发集上表现优异,但在测试集上性能骤降。
- 团队“瞄准错误的靶心”,浪费数月时间优化一个不具泛化性的目标。
✅ 正确做法
- 将所有可用数据混合(shuffle) ;
- 从混合后的整体数据中随机划分开发集和测试集;
确保两者同分布(i.i.d. assumption) ,即:
\[\mathcal{D}_{\text{dev}} \sim \mathcal{D}_{\text{test}} \sim p_{\text{real}}(x, y)\]其中 $p_{\text{real}}(x, y)$ 是你关心的真实世界数据分布。
🎯 二、开发集 + 单一评估指标 = 明确的优化目标
- 开发集的作用:用于快速评估和比较不同模型/超参/架构。
- 单一评估指标(Single-number metric) :如准确率(Accuracy)、F1 分数、AUC 等,使团队能高效决策。
设立开发集和评估指标,相当于为团队“设定靶心”。
一旦靶心固定,团队就能通过快速实验不断逼近目标。
若开发集与测试集分布不同,则相当于:
- 训练几个月后突然更换靶心 → 团队努力白费。
🧠 三、真实案例警示
- 案例:某贷款审批模型团队使用中等收入地区数据作为开发集,优化数月。
问题:上线时需在低收入地区部署,但两分布差异大(covariate shift):
\[p_{\text{dev}}(x) \neq p_{\text{test}}(x)\]- 后果:模型性能严重下降,浪费 3 个月工作量。
教训:不要让开发集成为“实验室玩具”,而要让它代表真实挑战。
🔁 四、工作流程建议
标准机器学习迭代流程应为:
- 收集反映真实场景的数据 $\mathcal{D} = {(x^{(i)}, y^{(i)})}_{i=1}^N$;
随机打乱并划分:
\[\mathcal{D} \xrightarrow{\text{shuffle}} \mathcal{D}_{\text{train}} \cup \mathcal{D}_{\text{dev}} \cup \mathcal{D}_{\text{test}}\]且满足:
\[\mathcal{D}_{\text{dev}}, \mathcal{D}_{\text{test}} \overset{\text{i.i.d.}}{\sim} p_{\text{target}}(x, y)\]- 在训练集上训练多种模型;
- 用开发集 + 单一指标选择最佳模型;
- 仅一次使用测试集做最终无偏评估。
⚠️ 测试集只能用于最终评估,不可用于任何模型选择或调参,否则会“污染”测试集。
📌 五、关键总结(要点清单)
| 原则 | 说明 |
|---|---|
| ✅ 同分布 | Dev 和 Test 必须来自同一分布 |
| ✅ 代表真实场景 | Dev/Test 应反映你最关心的应用环境 |
| ✅ 随机划分 | 所有数据先 shuffle,再划分 |
| ✅ 单一评估指标 | 便于快速比较模型 |
| ❌ 避免人为分割 | 如按地域、时间、用户类型硬性划分 Dev/Test |
| ❌ 避免分布偏移 | $p_{\text{dev}}(x,y) \neq p_{\text{test}}(x,y)$ 会导致评估失真 |
🔮 补充说明(预告)
- 训练集的设立:影响你“逼近目标的速度”,将在后续视频讲解(如是否可使用不同分布的大量数据进行预训练等)。
- Dev/Test 集大小选择:在深度学习时代,随着数据量增大,传统 70/15/15 划分不再适用,需根据任务调整(下节内容)。
📘 学习建议
- 在实际项目中,先明确“成功”的定义:你的模型要在哪些数据上表现好?
- 尽早建立 representative dev/test set,哪怕数据量小,也要保证分布一致。
- 若真实分布未知,可通过领域专家访谈、A/B 测试日志、用户反馈等方式近似。
本文由作者按照 CC BY 4.0 进行授权