一句话定义:McNemar 检验(McNemar's test)是一种配对显著性检验,用来判断两个模型在同一批测试题上的对错差异,究竟是真实差距,还是随机波动。
关键思路:只看不一致的题
设想两位医生读同一批病人的片子。要判断谁更强,你不需要统计两人都看对、或都看错的病例——两边都一致的结果,对“谁更好”这个问题不提供任何信息。你只需要比较两类人:“只有甲看出来、乙漏了”和“只有乙看出来、甲漏了”。如果两人水平相当,这两种情况应该数量相近,像抛硬币。
换成模型:1000 道题,模型 A 答对 800 道,模型 B 答对 820 道。把每道题拆成四种情况:
| B 对 | B 错 | |
|---|---|---|
| A 对 | 两边都对 | 只有 A 对(记为 b) |
| A 错 | 只有 B 对(记为 c) | 两边都错 |
McNemar 检验中有效的样本只有 b 和 c。零假设是 b 与 c 的期望数量相等,统计量约为 χ² = (|b−c|−1)² / (b+c),在原假设下近似服从自由度为 1 的卡方分布(减 1 是连续性校正)。当 b+c 很小时,改用精确二项检验更稳妥。
回到例子:那 20 道题的差距,可能来自 b=50、c=70,也可能来自 b=5、c=25。前一种情况说明结果基本上是噪声,后一种情况则说明差异相当扎实——只看“800 对 820”是看不出来的。
和相邻概念的区别
| 方法 | 适用场景 | 用错会怎样 |
|---|---|---|
| McNemar 检验 | 同一批样本、二值结果(对/错、好/坏) | — |
| 两比例 z 检验 / 卡方独立性检验 | 两组互不重叠的样本 | 忽略配对,丢弃信息,通常偏保守 |
| 配对 t 检验 | 同一批样本上的连续分数(如逐条打分) | 能用,但对二值结果不如 McNemar 贴合 |
| Bootstrap 置信区间 | 想说清“提升幅度的范围” | 与 McNemar 不冲突,常一起报 |
对从业者的实际意义
- 要同时报告 b、c 和 p 值:p 值小只说明“不像噪声”,不说明这 2 分值得上线。净提升其实是 (c−b)/n。
- 测试集太小要警惕:200 道题里多答对 4 道,无论怎么算都很难显著。想分辨 2 个点的差距,测试集规模必须足够大。
- 一次比较多个模型或多次迭代时要做多重比较校正,否则总会有某一对模型看起来“显著”。
- 同样的框架适用于人评 A/B 偏好、RAG 改动前后、Prompt 微调前后——只要是同一批样本上每个样本给出“好/坏”的结果。
一句话总结:别比总分,比不一致的那部分。 具体实现和临界值以统计软件文档与官方说明为准。
