ML 实验三层设计:切数据 · 选尺子 · 信比较
R — 原文 (Reading)
测试集应该尽可能与训练集互斥……老师出了10道习题供同学们练习,考试时老师又用同样的这10道题作为试题,这个考试成绩能否有效反映出同学们学得好不好呢?答案是否定的。
— 周志华,《机器学习》第2章 2.2节
自助法在数据集较小、难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处。然而,自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差。
— 周志华,《机器学习》第2章 2.2.3节
错误率和精度虽常用,但并不能满足所有任务需求。以西瓜问题为例,假定瓜农拉来一车西瓜……若我们关心的是"挑出的西瓜中有多少比例是好瓜",或者"所有好瓜中有多少比例被挑了出来",那么错误率显然就不够用了。
— 周志华,《机器学习》第2章 2.3.2节
性能度量反映了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果;这意味着模型的"好坏"是相对的,什么样的模型是好的,不仅取决于算法和数据,还决定于任务需求。
— 周志华,《机器学习》第2章 2.3节
它们大都隐式地假设了均等代价……在非均等代价下,我们所希望的不再是简单地最小化错误次数,而是希望最小化"总体代价"(total cost)。
— 周志华,《机器学习》第2章 2.3.4节
若一个学习器的P-R曲线被另一个学习器的曲线完全"包住",则可断言后者的性能优于前者……如果两个学习器的P-R曲线发生了交叉,则难以一般性地断言两者孰优孰劣。
— 周志华,《机器学习》第2章 2.3.2节
在使用交叉验证等实验估计方法时,不同轮次的训练集会有一定程度的重叠,这就使得测试错误率实际上并不独立,会导致过高估计假设成立的概率。为缓解这一问题,可采用"5×2交叉验证"。
— 周志华,《机器学习》第2章 2.4.2节
I — 方法论骨架 (Interpretation)
任何"跑实验"都可以拆成三个先后必须想清楚的设计层,顺序不能颠倒:
第一层:数据怎么切。 你只有一份数据,却既要拿它训练又要拿它证明模型好用——所以必须人为制造"没见过的题"。三种主流切法各有适用域:留出法简单但单次结果不稳(要分层采样+多次随机划分取均值);k 折交叉验证让每个样本都轮到过测试位,是中等数据的默认选择;自助法(bootstrap)专为"小到难以划分"或"需要制造多个不同训练集"的场景而生,代价是改变了数据分布、引入估计偏差。切法的本质权衡是:训练数据利用率 vs 估计的无偏性。
第二层:用什么尺子量。 度量不是客观事实而是任务需求的编码。"好坏是相对的"——换一把尺子,排名可能反转。选尺子的推理链:先问业务最怕哪种错(漏放 vs 误杀)→ 映射为查准/查全取向 → 用 β 或代价矩阵把偏好形式化 → 再检查所选度量的隐藏前提(多数经典度量隐含"所有错误同价"和"类别均衡"两个假设,现实常常都不成立)。类别极不平衡时 accuracy 会彻底失灵。
第三层:怎么比才可信。 测试错误率本质上是一次随机采样的实现值,不是真值;加上测试集选择效应与算法随机性两重干扰,直接比大小不可信。可信的比较 = 多次重复运行消除随机性 + 统计检验确认差距不是噪声;多算法多数据集走 Friedman+Nemenyi 流程;注意 k 折 CV 的折间重叠会破坏 t 检验的独立性前提,须改用 5×2cv。
A1 — 书中的应用 (Past Application)
案例 1: 老师出题考试类比 + 留出法 1000 样本演算(c03/c04)
- 问题: 为什么测试集必须与训练集互斥?一份 1000 样本的数据该怎么划、结果该怎么报?
- 方法论的使用: 作者用"10 道练习题原题考试"建立直觉后,给出完整演算:D 含 1000 样本按 7:3 划分,S 训练后在 T 上错 90 个 → 错误率 90/300=30%、精度 70%。随即指出两个坑:(1) 必须分层采样——500 正/500 反的数据分出 350/350 + 150/150 才保分布;(2) 单次划分不稳,要做约 100 次随机划分取均值±标准差。
- 结论: 一个例子同时回答"怎么分、分完怎么算、为什么要重复"三件事。
- 结果: 这套操作成为留出法的标准姿势,也奠定了全书"评估先于建模"的基调。
案例 2: 自助法 36.8% 包外演算(c05)
- 问题: 数据集小到一切就捉襟见肘时怎么既训练又测试?
- 方法论的使用: 自助采样 m 次得 D′,(1−1/m)^m → 1/e ≈ 36.8%,即约 36.8% 的样本从未被抽中,天然构成测试集(包外估计 OOB)。
- 结论: 小数据下自助法"物尽其用";且同一机制能产出多个不同训练集供集成学习使用——但它改变分布引入偏差,数据充足时应让位给留出/CV。
- 结果: 该演算后来在第8章成为 Bagging"免费获得测试估计"的理论根基,一处推导两处兑现。
案例 3: 代价不对称双场景 + 二项检验与 Friedman 全程演算(c08/c09/c10)
- 问题: 医疗诊断漏诊远贵于误诊、门禁误放远贵于误拦——错误率还够用吗?测得错误率 0.3 能直接当泛化错误率吗?三个算法四个数据集怎么规范比出高低?
- 方法论的使用: (1) 构造代价矩阵,把"数错误次数"换成"加权总体代价",并点破通常只关心代价比值而非绝对值;(2) 指出测试错误率服从二项分布、只是随机变量的一次实现,由此引出二项检验给置信度;(3) 完整跑通 Friedman 流程——排序赋序值、算得 TF=24.429 > 临界值 5.143 拒绝"性能相同"、Nemenyi 算出 CD=1.657、画检验图读线段交叠:A 与 C 显著不同,A-B、B-C 不显著。
- 结论: 尺子要随代价换;数字差距要过检验才能变成结论;"显著不同"只在特定配对上成立,不是全局冠军叙事。
- 结果: 三段演算分别成为代价敏感学习、假设检验入门、多算法比较的事实标准流程。
A2 — 触发场景 (Future Trigger) ★
用户会在什么情境下需要这个 skill?
- 动手训练模型之前设计实验方案:"我有一批数据,该留多少做测试?用几折交叉验证?"
- 选择/质疑评价指标:"模型 accuracy 99% 是不是很好?""这个场景该看 precision 还是 recall?要不要 AUC?"
- 类别极度不平衡或错误代价不对称的任务(风控/医疗/欺诈检测),怀疑 accuracy 或均等代价度量失效。
- 对比两个/多个模型或算法,需要判断差距是真提升还是噪声:"我的方法比 baseline 高 0.5%,能说有提升吗?"(写论文、答辩、汇报前尤其高频)
- 数据量很小(几十到几百条)不知道怎么评估,或者复现他人实验发现数字对不上、想核查评估协议是否一致。
语言信号 (用户的话里出现这些就应激活)
- "怎么划分 train/test"、"留出还是交叉验证"、"几折 cross-validation"、"bootstrap/自助法"
- "用什么指标/度量"、"precision 还是 recall"、"F1 还是 AUC"、"99% 精度高不高"
- "类别不平衡 accuracy 没用"、"漏报误报代价不一样"、"cost-sensitive"
- "提升了 0.5% 算显著吗"、"显著性检验"、"Friedman/Nemenyi"、"t 检验"
- "实验怎么设计"、"结果不稳定每次跑都不一样"、"evaluation protocol"
与相邻 skill 的区分
- 与
ml-diagnosis的区别(定稿口径:双向 contrasts): 本 skill 管实验开始前的设计(切数据、定尺子、定比较协议);ml-diagnosis 管实验结束后拿到坏结果的归因(偏差/方差主导、过拟合缓解)。用户说"效果不好怎么办"走 ml-diagnosis,说"实验还没跑/结果能不能信"走本 skill。互为闸门:diagnosis 步骤 3 发现验证集可疑/度量失配时移交本 skill 先修评估。 - 与
ml-task-matching的区别: 那是更上游的选型(候选池怎么按任务构成、榜单能不能信);本 skill 在候选已定时回答"怎么评才可信"。选型 skill 的第 5 步最小验证实验即移交到本 skill。 - 与
ml-imbalanced-learning的区别: 本 skill 负责识别"不平衡使 accuracy 失效"并完成度量层面的选型(P/R/Fβ/代价敏感);具体的再缩放三路线、SMOTE/EasyEnsemble 等重采样实现细节由 ml-imbalanced-learning 展开。 - 与
ml-pitfall-audit的区别: 本 skill 是主动的前置设计框架;ml-pitfall-audit 是横向的前提审查清单(含本 skill 的 x11/x18 两条深坑的跨域延伸),用于审查任意方法的隐藏假设。
E — 可执行步骤 (Execution)
当 skill 被激活后, agent 应按以下步骤执行:
盘点数据规模与约束,选定切分方案
- 问清三件事:总样本量 m、类别比例、评估目的(单模型调参 or 算法对比 or 交付前终评)。
- 按"规模 × 用途"落位:m 大(数千以上)→ 单次留出已够,不必浪费算力重复划分;m 中等 → k 折 CV(常 5 或 10,分类任务用分层 StratifiedKFold);m 小难以划分或需产生多个训练集 → 自助法 + 包外估计,并向用户声明其分布偏差代价。
- 完成标准: 输出一个明确的切分决定(方案名 + 关键参数 k 或比例),且分类任务确认使用了分层采样。
从任务需求反推性能度量
- 先问业务:"哪种错误更贵?漏放正类(FN)还是误杀负类(FP)?"→ 有明确不对称 → 代价敏感度量/Fβ(怕漏则 β>1);需求是"整体排序质量" → ROC-AUC / P-R 曲线;只有均衡二分类且两类错误同价才允许 accuracy。
- 判停条件: 若正例占比极端(如 <5%)且有人提议只报 accuracy → 强制拦截,改报混淆矩阵 + PR-AUC/召回,并引用 998 反例说明理由。
- 若涉及阈值选择 → 说明截断点规则:重查准靠排序前段截断、重查全靠后段截断。
- 完成标准: 选定的度量能一句话回答"它编码了什么任务偏好",且已审计其隐藏假设(均等代价?无偏采样?)是否在本任务成立。
设计可信的比较协议
- 单模型自评: 报告多次运行的均值 ± 标准差,禁止单次数字下结论(算法有随机性)。
- 两模型对比: 差距小于一个运行波动幅度时,先做配对检验;用 k 折 CV 做 t 检验前提醒折间重叠会夸大显著性 → 改 5×2cv 或 McNemar。
- 多算法 × 多数据集: 排序 → Friedman 检验拒绝"性能相同" → Nemenyi 后续检验算 CD → 画临界值域交叠图读结论。
- 完成标准: 用户得到一套可直接执行的比较流程(重复次数、检验名称、显著性水平 α),以及"哪些结论允许写、哪些必须降级"的清单。
交付检查(收尾闸门)
- 提醒两件高频事故: (a) 调参用的步长网格本身是开销-精度的折中,搜出的参数并非全局最佳,够用即可;(b) 模型与超参敲定后必须在全量数据上重新训练再交付——否则交付的是只见过部分数据的残品。
- 测试集纪律: 最终测试集只能碰一次;反复拿它当验证集选模型等于泄题。
- 完成标准: 向用户复述"最终模型的训练数据范围 + 测试集使用次数",两项都合规才算设计闭环。
B — 边界 (Boundary) ★
不要在以下情况使用此 skill
- 模型已经训完、结果已经出来且不好,要找原因——那是 ml-diagnosis(偏差-方差归因)的地盘,本 skill 只管事前设计。
- 用户只是要一段 sklearn 的
cross_val_score调用代码而无任何方案疑问——直接写代码即可,不必启动整套设计流程。 - 分布漂移/线上 A/B 实验/在线学习评估——本书框架建立在 i.i.d. 假设之上,对流式与漂移场景只提供有限参考,应另寻 MLOps/因果类方法。
- benchmark 打榜、few-shot 大模型评测这类"评估重心在 benchmark 设计"的现代范式——本 skill 的逐算法精细对比流程在此显得过重。
作者在书中警告的失败模式
- 单次留出不可信 (x04): 单次划分结果往往不够稳定可靠;不分层则引入分布偏差。200 条医疗样本跑一次报 92% 精度属于无效结论,须先查分层再做多次划分报均值±波动。
- 自助法的分布偏差 (x05): bootstrap 改变了初始数据集分布、引入估计偏差——数据充足时留出/CV 更常用;不要因为"听起来高级"就无脑自助。
- 忘全量重训 (x06): 模型选择完成后应该用数据集 D 重新训练模型才是交付品;GridSearchCV 的 best_estimator_ 只见过折内数据,直接上线是事故。
- accuracy 不够用 (x07): 错误率衡量不了"挑出的瓜中好瓜比例"这类需求,度量必须跟着任务走。
- 曲线交叉不能断言优劣 (x08): P-R/ROC 曲线交叉时难以一般性断言孰优孰劣,只能在具体工作点条件下比,或声明以 AUC 为综合判据。
- 均等代价失效 (x09): 错误率隐含"所有错误同价"假设;癌症筛查 error rate 2% 可能意味着大量漏诊——目标是最小化总体代价而非错误次数,且重要的是代价比值非绝对值。
- 直接比大小翻车 (x10): 测试集偶然性 + 测试集选择效应 + 算法随机性三重干扰下,"高 0.5%"可能是噪声。
- CV-t 检验前提破坏 (x11): 不同轮次训练集重叠使测试错误率不独立,显著性被系统性夸大;k 小时 McNemar 还倾向"无差别"——须用具名修正方案。
- 998 反例 (x16): 998 反例 2 正例时永远猜反例就有 99.8% 精度但毫无价值;不平衡到"永远猜多数类也能达标"即告 accuracy 失守。
- 重采样的二阶坑 (x17): 过采样简单复制正例会严重过拟合;欠采样随机丢反例会丢失重要信息——修复动作自身引入新失败模式。
- 再缩放的无偏采样假设 (x18): "训练集是真实总体的无偏采样"往往并不成立(如用已报警案件训练盗刷检测),观测几率 ≠ 真实几率,阈值会移错方向。
作者的盲点 / 时代局限
- 成书于 2015-2016:未覆盖预训练-微调范式下的 few-shot/benchmark 泛化评估;对 i.i.d. 假设之外的分布漂移只有只言片语(序言中李未院士已专门质疑)。
- 工程视角薄弱:不讲数据质量管理、特征管道版本化、线上线下一致性、A/B 上线等落地环节,"评估"止步于离线指标。
- 偏差-方差分解的优美形式仅在回归任务上有严格推导,分类任务的分解只能靠实验估计——迁移到分类场景时要意识到这是近似工具。
- 但凡进入严肃生产(医疗、工业、科研),样本昂贵、错误代价高,这套三层评估体系仍是不可替代的基本功——盲点是时代的,不是原理的。
容易混淆的邻近方法论
- 偏差-方差诊断(ml-diagnosis): 同出第 2 章,但一个是"设计评估协议"(事前),一个是"解剖误差来源"(事后)。
- PAC 可学习性提问(ml-theory-compass): 同样处理"置信度+误差",但 PAC 是把模糊需求翻译成 (ε,δ) 契约的理论框架,不涉及具体切数据与跑检验的操作。
- 现代 AutoML/贝叶斯优化: 同样面对调参预算分配,但本 skill 强调的是"候选覆盖优先于单点精修 + 测试集封存"的手工纪律,而非自动化搜索算法本身。
相关 skills
- depends-on: ml-pitfall-audit(x11 CV-t 检验独立性、x18 无偏采样两条深坑的前提审查由其横向兜底)
- contrasts-with: ml-diagnosis(事前设计 vs 事后归因,互为闸门), ml-task-matching(评估协议 vs 上游选型)
- composes-with: ml-imbalanced-learning(度量选型命中不平衡后接重采样路线), ml-ensemble-design(比较多个集成方案时的检验协议)
审计信息
- 验证通过: V1 ✓ / V2 ✓ / V3 ✓(f05/f06/f07/f08 + x04-x11/x16-x18 + c03-c10/c20 共 23 单元,见 verified-fp.md / verified-xc.md)
- 测试通过率: 待阶段 4 压力测试(test-prompts.json)
- skill_version: 0.0.1
- 蒸馏时间: 2026-08-24