# Ml Evaluation Design

> ML 实验前的三层设计：数据怎么切（留出/交叉验证/自助 hold-out / k-fold CV / bootstrap）、用什么度量（accuracy / precision-recall / Fβ / ROC-AUC / cost-sensitive）、怎么比较才可信（显著性检验 / Friedman+Nemenyi）。当用户设计实验、选评估指标、问"几折交叉验证""99% 精度好不好""高 0.5% 显著吗"时激活。不适用于训后偏差-方差诊断（ml-diagnosis）与不平衡重采样细节（ml-imbalanced-learning）。

- Skill: `fieldlu/ml-evaluation-design` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add fieldlu/ml-evaluation-design`
- Raw SKILL.md: https://api.skillmd.com/api/skills/fieldlu/ml-evaluation-design/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: fieldlu (https://skillmd.com/u/fieldlu)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/fieldlu/ml-evaluation-design

---


# 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?

1. 动手训练模型之前设计实验方案："我有一批数据，该留多少做测试？用几折交叉验证？"
2. 选择/质疑评价指标："模型 accuracy 99% 是不是很好？""这个场景该看 precision 还是 recall？要不要 AUC？"
3. 类别极度不平衡或错误代价不对称的任务（风控/医疗/欺诈检测），怀疑 accuracy 或均等代价度量失效。
4. 对比两个/多个模型或算法，需要判断差距是真提升还是噪声："我的方法比 baseline 高 0.5%，能说有提升吗？"（写论文、答辩、汇报前尤其高频）
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 应按以下步骤执行:

1. **盘点数据规模与约束，选定切分方案**
   - 问清三件事：总样本量 m、类别比例、评估目的（单模型调参 or 算法对比 or 交付前终评）。
   - 按"规模 × 用途"落位：m 大（数千以上）→ 单次留出已够，不必浪费算力重复划分；m 中等 → k 折 CV（常 5 或 10，分类任务用分层 StratifiedKFold）；m 小难以划分或需产生多个训练集 → 自助法 + 包外估计，并向用户声明其分布偏差代价。
   - 完成标准: 输出一个明确的切分决定（方案名 + 关键参数 k 或比例），且分类任务确认使用了分层采样。

2. **从任务需求反推性能度量**
   - 先问业务："哪种错误更贵？漏放正类（FN）还是误杀负类（FP）？"→ 有明确不对称 → 代价敏感度量/Fβ（怕漏则 β>1）；需求是"整体排序质量" → ROC-AUC / P-R 曲线；只有均衡二分类且两类错误同价才允许 accuracy。
   - 判停条件: 若正例占比极端（如 <5%）且有人提议只报 accuracy → 强制拦截，改报混淆矩阵 + PR-AUC/召回，并引用 998 反例说明理由。
   - 若涉及阈值选择 → 说明截断点规则：重查准靠排序前段截断、重查全靠后段截断。
   - 完成标准: 选定的度量能一句话回答"它编码了什么任务偏好"，且已审计其隐藏假设（均等代价？无偏采样？）是否在本任务成立。

3. **设计可信的比较协议**
   - 单模型自评: 报告多次运行的均值 ± 标准差，禁止单次数字下结论（算法有随机性）。
   - 两模型对比: 差距小于一个运行波动幅度时，先做配对检验；用 k 折 CV 做 t 检验前提醒折间重叠会夸大显著性 → 改 5×2cv 或 McNemar。
   - 多算法 × 多数据集: 排序 → Friedman 检验拒绝"性能相同" → Nemenyi 后续检验算 CD → 画临界值域交叠图读结论。
   - 完成标准: 用户得到一套可直接执行的比较流程（重复次数、检验名称、显著性水平 α），以及"哪些结论允许写、哪些必须降级"的清单。

4. **交付检查（收尾闸门）**
   - 提醒两件高频事故: (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

