模型验证 — 完整课堂笔记
来源: 数据科学 · 模块 3 — 模型验证 · Coursera · Andrew Park · 46 分钟讲座
为何拆分数据
视频- 目标: 估计模型在从未见过的数据上的表现 —— 唯一重要的指标。
- 失败模式: 只在训练集上评分时每个模型都看起来很棒 —— 包括糟糕的。
- 留出原则: 任何决策(模型选择、超参数)都不能在最终评估前使用测试集。
- 为何不只是多训练: 训练集准确率受模型容量限制;它对泛化没有任何信息。
- 教授的比喻: 「用训练准确率就像给自己的作文打分」—— 14:48 时间戳。
三路拆分
视频- 训练集: 用学习算法拟合模型参数。
- 验证集: 用来调超参数和在模型间选择 —— 多次接触。
- 测试集: 最后只用一次,估计真实世界表现。
- 为何 3 个不是 2 个: 如果在测试集上调,它就变成第二个训练集 —— 对泛化会过度自信。
- 常见错误: 看测试集分数再回去调模型 —— 这会让测试集失效。
典型拆分比例
视频- 70/15/15: 中等数据集的默认(1k–10万样本)。
- 80/10/10: 1 万–10 万样本可用且训练集会做 CV 时常见。
- 大数据 98/1/1: 100 万+ 样本时 1% 仍然是 1 万 —— 足以稳定估计。
- 小数据替代: 1 千以下样本时,用交叉验证而不是固定验证集。
分层
视频- 何时: 目标有类别不平衡或稀有事件时,用分层采样。
- 如何: 在 train/val/test 拆分中保留类别比例 —— 防止验证集偶然 0 正例。
- 工具: sklearn 的 StratifiedKFold 或 train_test_split(stratify=y)。
- 连续 y: 回归任务把目标分位数化再分层。
交叉验证(课节 3.3 预告)
视频- k 折 CV: 把训练集分成 k 份;在 k-1 上训练、1 上验证;轮换;平均 k 个分数。
- 典型 k: 5 或 10 —— 多数场景超过 10 收益递减。
- 留一: k = n;估计方差极高但无偏;只在极小数据集上用。
- 分层 k 折: 每折保留类别比例 —— 分类问题的默认选择。
- 时间序列 CV: 扩展窗或滚动窗拆分;绝不在未来数据上训练。
过拟合(时间戳 31:20)
视频- 定义: 模型记住训练集噪声而不是学习信号。
- 信号: 训练准确率上升时验证准确率持平或下降。
- 原因: 样本相对模型容量太少、特征太多、无正则化、无早停。
- 修复: 更多数据、更简单模型、L1/L2 正则、dropout、早停、数据增强。
- 诊断: 画训练 vs 验证准确率随 epoch 的图 —— 曲线分叉 = 过拟合。
数据泄露(进阶)
视频- 预处理陷阱: 在完整数据集(含 val/test)上拟合 scaler/imputer —— 泄露分布信息。
- 修复: 把预处理放进 Pipeline 内做交叉验证,验证数据永远不在拟合期间被看到。
- 目标泄露: 从目标派生的特征(如目标是调查结果时的「调查后天数」)→ 不真实的准确率。
- 时序泄露: 用未来数据预测过去 —— 时间序列常见;用合适的滚动拆分。
推演例
视频- 设定: 1 万样本,二分类,70/15/15 拆分。
- 数量: 训练 = 7,000;验证 = 1,500;测试 = 1,500。
- 分层: 若类别比 80/20,每个拆分保留这个比例 —— 训练集 5,600 负 / 1,400 正。
- 流水线: 在训练集上拟合 scaler → 用同一个 scaler 变换 val/test;绝不重拟合。
- 最终模型: 在 val 上调好后,再在 train+val 上重训,报告一个测试数字。






