
1. 整体思路与方案选型1.1 这两个指标到底在回答什么问题做分类模型评估或诊断测试比对时我们经常陷入一个尴尬境地两个模型在测试集上的准确率分别是 92.3% 和 92.7%差了 0.4 个百分点。这到底算不算真的“更强”如果数据量足够大0.4% 的差距可能确实有统计学意义但如果样本只有几百条这点差异完全可能是随机波动。于是问题就来了你需要的不是一个“谁的数字大”的判断而是一个“差异是否显著、是否真实存在”的统计检验——McNemars Test 就是针对这一场景设计的。McNemars Test 的核心适用场景是两个分类器或两种诊断方法在完全相同的样本集上做配对比较。注意“配对”这两个字这是它区别于普通卡方检验的关键。普通卡方检验处理的是两组独立样本比如用 A 模型测试 1000 条数据、用 B 模型测试另外 1000 条数据两者之间没有对应关系。但实际项目中我们通常是把同一个测试集同时喂给两个模型这时每条样本在 A 模型下有一个预测结果、在 B 模型下也有一个预测结果它们天然成对直接用独立样本检验就浪费了配对结构中的信息。Kappa Agreement 回答的则是另一类问题两个评估者人或模型在分类结果上到底有多一致举一个很常见的场景你要训练一个文本分类模型需要先让两个标注员给 5000 条样本打标签然后才能把标注结果当作训练数据。问题是标注员之间也可能存在主观差异如果两人对同一批样本的标注一致性很低说明标签本身就不稳定模型学得再好也没有意义。Kappa 系数就是把这种“一致性”量化成一个介于 -1 到 1 之间的数值越接近 1 表示一致性越高0 附近表示和随机乱标差不多。这两个指标看似方向不同——一个在检验“差异”一个在度量“一致”——但实际项目里它们经常成对出现。原因在于当你比较两个模型时你不仅关心“谁更好”还想知道“好在哪里、有多好”当你评估标注质量时你不仅想知道“两人是否一致”还想知道“不一致的地方是否偏向某个类别”。两个指标放在一起正好能覆盖从“差异显著性检验”到“一致程度量化”的完整评估链条。1.2 什么时候该用 McNemar什么时候该用 Kappa很多初学者最容易搞混的一点是把这两个指标当成可以互相替代的方案。我一开始也踩过这个坑拿 Kappa 算完发现两个模型的一致性很高就以为“这两个模型没有显著差异”然后写进实验报告被审稿人怼了一顿。这两个指标测量的东西完全不同选择依据要看你想回答什么问题。如果你想知道的是“两个模型/两种方法/两个标注员的输出结果在统计意义上是否存在显著差异”那用 McNemars Test。典型场景是模型 A 在测试集上的准确率是 90%模型 B 是 88%你想确认这个差异不是因为随机波动造成的那么把每个样本的预测结果对/错整理成配对四格表跑一次 McNemar 检验就行。如果你想知道的是“两个模型/两个标注员/模型与真实标签之间在非随机的意义上有多一致”那用 Kappa。典型场景是人工标注结果是类别 1模型也预测成类别 1这种“同时判对”的情况占比固然重要但 Kappa 还要扣掉“即使随机猜也有一定概率撞对”的部分。它能告诉你一致性中有多少是超越了随机水平的。说得更直白一点McNemar 看的是差异的显著性Kappa 看的是一致的强度。前者给出 p 值后者给出一个相关系数式的评分。如果你在一个模型对比实验里只报告 Kappa不谈差异显著性评审或业务方还是会追问“到底哪个模型更好”反过来如果只报告 McNemar 的 p 值不量化一致程度那你无法回答“两个模型的输出究竟重合度多高”。实操中两者互补前者做统计判断后者做效应量评估这种搭配也符合统计学上“显著性 效应量”双报告的原则。1.3 为什么这两个方法常被放在同一个分析框架里在医学诊断、机器学习模型对比、标注质量评估这三类典型项目中McNemars Test 和 Kappa Agreement 往往出现在同一套评测流程里。以医学影像 AI 为例先让两位影像科医生对一批 CT 影像独立判读用 Kappa 评估医生之间的一致性——如果 Kappa 连 0.6 都不到说明诊断标准本身就模糊后续任何模型评测都缺乏可信基准。接着把 AI 模型的输出与医生的金标准对比同样用 Kappa 评估 AI 与医生的一致程度最终还要检验 AI 和医生在阳性/阴性判断上的差异是否显著此时 McNemar 派上用场——它专门考察“模型判阳性但医生判阴性”和“模型判阴性但医生判阳性”这两类不一致格子的分布是否均衡。这套流程在 NLP 领域同样常见两个大模型在同一批推理题目上的输出对比先用 Kappa 看整体重合度再用 McNemar 检验看正确率的差异是否显著两个标注平台在同一批文本上的标签结果同样可以用 Kappa 验证标注一致性用 McNemar 检验不同平台的纠偏效果。本质上这是从描述统计到推断统计的完整闭环Kappa 负责描述“一致性长什么样”McNemar 负责推断“差异是不是真存在”。单看其中一个你的分析报告都是不完整的。2. McNemars Test 核心细节与实操要点2.1 数学原理四格表与不对称显著性McNemars Test 的底层逻辑非常朴素。假设你有两个模型 M1 和 M2在同一个包含 n 条样本的测试集上分别做预测。把每条样本的预测结果与真实标签比对得到“对/错”两个结果。随后把两个模型的结果交叉汇总成一个 2×2 列联表M2 正确M2 错误M1 正确abM1 错误cd四个格子的含义分别是aM1 和 M2 都预测正确的样本数两模型一致同意且都对dM1 和 M2 都预测错误的样本数两模型一致同意且都错bM1 正确但 M2 错误的样本数M1 优于 M2 的样本cM1 错误但 M2 正确的样本数M2 优于 M1 的样本注意 a 和 d 这两个格子它们是两个模型输出方向完全一致的样本对于判断“谁更好”没有直接贡献。真正能说明问题的是 b 和 c——这两个“不一致”的格子。如果两个模型性能相当那么 M1 独对而 M2 独错的样本数和 M2 独对而 M1 独错的样本数理论上应该差不多即 b ≈ c。McNemar 检验的统计量正是基于 b 和 c 构造的。原始公式是χ² (b - c)² / (b c)自由度degree of freedom, df为 1对应卡方分布。但实操中几乎不会用这个原始公式因为它在样本量较小时会高估卡方值导致假阳性。更通用的是加入连续校正continuity correction的版本也叫 Edwards 校正χ² (|b - c| - 1)² / (b c)这个“减 1”的校正在 b c 较小时能显著降低误判风险。我通常的建议是只要 b c 小于 100一律用校正版大于 100 时两者差异可以忽略但统一用校正版也不会错。还有一个更稳妥的做法当 b c 很小比如小于 25时直接用二项检验。因为 McNemar 检验本质上是在检验“在不一致的样本中b 是否显著偏离二项分布 p0.5”的假设。此时精确的 p 值可以用二项分布binom.test计算在 n b c 次独立的“不一致事件”中观察到的少于等于 b 的概率的尾部。这种精确检验在小样本下远比卡方近似可靠。2.2 从四格表到结论完整实操步骤假设你在做一个二分类模型的版本迭代旧模型是 v1新模型是 v2测试集有 800 条样本。整理预测结果后得到如下数据a两模型都对580bv1 对v2 错40cv1 错v2 对78d两模型都错102总计 800没问题。这时 v2 总体正确率是 (580 78) / 800 82.25%v1 是 (580 40) / 800 77.5%看起来 v2 比 v1 高了近 5 个百分点。但你直接报“v2 更好”不够严谨还需要 McNemar 检验来确认这个差异是否统计显著。代入校正公式χ² (|40 - 78| - 1)² / (40 78) (37²) / 118 ≈ 11.60查卡方分布表df1 时显著性水平 0.05 对应的临界值是 3.840.01 对应 6.63。11.60 远大于 6.63所以 p 0.01结论是在 99% 的置信水平下v2 与 v1 在测试集上的性能差异是统计显著的v2 确实优于 v1。如果不用校正公式卡方值会略大一些(78 - 40)² / 118 ≈ 12.24同样显著。但注意如果 b 和 c 更接近比如 b55c63那么校正后 χ² (|55-63|-1)² / 118 ≈ 0.415p 值远大于 0.05结论就是“不能拒绝原假设即两模型性能没有显著差异”。这两组数据在准确率上可能只差零点几个百分点但 McNemar 能告诉你这个差异是否值得写进结论。2.3 实操中的三个关键坑第一个坑非配对数据误用 McNemar。这个错误非常隐蔽。有些同学拿两个模型一个在训练集上测一个在测试集上测然后构造四格表跑 McNemar——这是完全错误的。McNemar 要求两条样本必须是一一配对的同一样本训练集和测试集根本不是同一批样本配对关系不存在检验结果毫无意义。同样的道理数据集划分前后不一致也会破坏配对结构。第二个坑忽略 b c 的样本量。即使卡方值很大如果 b c 只有十几条这个显著性的可信度也很低。比如 b2c14校正后 χ² (|2-14|-1)² / 16 ≈ 7.56看起来显著但实际只有 16 条不一致样本误差范围极大。这种情况下卡方分布的近似效果很差应该改用二项精确检验。R 语言的binom.test(2, 16, p0.5)算出来的 p 值约为 0.004仍然显著但用mcnemar.test的普通卡方版本 p 值可能为 0.01 左右两者有差距。我的经验是b c 30 时优先用精确检验。第三个坑只报告 p 值不报告差异方向。McNemar 检验告诉你差异是不是显著但不告诉你哪个模型更好。你需要自己观察 b 和 c 的相对大小如果 b c说明 M1 优势更大M1 对而 M2 错的样本更多反之则是 M2 更好。写报告时一定要把 b 和 c 的原值放进去否则读者只能看到一个“p 0.05”完全无法判断方向。3. Kappa Agreement 的完整拆解3.1 Cohens Kappa 的公式与直觉理解Kappa 系数最常用的版本是 Cohens Kappa计算公式是κ (P₀ - Pₑ) / (1 - Pₑ)其中 P₀ 是观测一致率observed agreement即两个评估者在所有样本上实际判同的比例Pₑ 是期望一致率expected agreement即两个评估者在互相独立且随机判定的假设下“碰巧”判同的比例。公式的核心思想非常精妙从实际一致率中扣除随机一致的部分剩下的才是真正的、超越随机水平的一致性。用一个简单例子说明。假设两个标注员对 100 条文本做情感二分类正向/负向观测结果如下标注员B正向标注员B负向合计标注员A正向401050标注员A负向203050合计6040100对角线上的 40 和 30 是两人判定一致的样本P₀ (40 30) / 100 0.7看起来“挺一致”的。但期望一致率呢标注员 A 判正向的边缘概率是 50/100 0.5标注员 B 判正向的边缘概率是 60/100 0.6两人独立随机判定时恰好都判正向的概率是 0.5 × 0.6 0.3同理都判负向的概率是 0.5 × 0.4 0.2。所以 Pₑ 0.3 0.2 0.5。代入公式κ (0.7 - 0.5) / (1 - 0.5) 0.4这里你就能看出 Kappa 的狠劲表面上 70% 的一致率很高但因为两个标注员都喜欢判“正向”边缘概率明显不均衡即使他们完全随机乱标也有一半概率会撞对。Kappa 0.4 说明实际一致性只比随机水平高出 0.4/0.5 80% 的“最大可能提升空间”而不是字面意义的 70%。3.2 Kappa 的类型与选型不要拿 Cohen 硬扛多评估者场景Cohens Kappa 只适用于两个评估者。如果你的项目里有三个标注员或者三模型相互比较再用 Cohens Kappa 就会撞墙。这时有两个替代方案Fleiss Kappa处理多个评估者的一致性评估者数量可以大于 2且每个评估者分别标注一批样本。它先把每个评估者的结果摊成一个多评估者矩阵然后计算所有评估者之间的总体一致性。在标注任务中如果 4 个标注员各自标注 2000 条样本最后汇总成一个 2000 × 4 的标签矩阵就用 Fleiss Kappa。加权 KappaWeighted Kappa适用于有序分类如等级评分 1~5 分。普通 Kappa 把“差 1 分”和“差 4 分”等同看待这显然不合理加权 Kappa 会给不同的“不一致距离”分配不同权重通常用线性权重或二次权重。在预测性别的二分类任务里没必要用加权但在“疾病严重程度分级”“文本情感强度评分”这类有序尺度任务中加权 Kappa 几乎是标配。选型规则很简单两个评估者、无序分类用 Cohen多个评估者、无序分类用 Fleiss两个评估者、有序分类用加权 Cohen多个评估者、有序分类则可以考虑多次两两计算加权 Kappa 再取均值或使用更复杂的一般化系数。实际业务中两两对比的 Kappa 矩阵比一个笼统的 Fleiss 系数更有解释力——你能直接看到是哪两个标注员之间最容易出现分歧。3.3 Kappa 的刻度表与解释陷阱Landis 和 Koch 在 1977 年提出的经典刻度表到现在仍是主流参考Kappa 值一致程度 0比随机一致性还差可能系统性地反向一致0 ~ 0.20极低一致性slight agreement0.21 ~ 0.40一般一致性fair agreement0.41 ~ 0.60中等一致性moderate agreement0.61 ~ 0.80高度一致性substantial agreement0.81 ~ 1.00几乎完全一致almost perfect agreement但这里必须提醒刻度表只是经验参考不是硬性标准。Kappa 值受类别分布影响极大。如果样本中 95% 是负类、5% 是正类两个标注员全都标负类P₀ 0.95但 Pₑ 0.95² 0.05² ≈ 0.905算出来的 Kappa ≈ (0.95 - 0.905) / (1 - 0.905) ≈ 0.474明明模型一无所获Kappa 还能到 0.47这个数值在刻度表上已经是“中等一致”。这种现象在类别不平衡场景中非常常见业界称之为 Kappa 悖论。所以解读 Kappa 前一定先看边际分布。如果某个类别的比例超过 90%Kappa 的参考价值要大打折扣这时我会额外查看每个类别的逐类精确率和召回率。另一个解读陷阱是Kappa 只衡量一致性不衡量正确性。两个标注员如果使用同一套错误标准Kappa 可能高达 0.9但标签整体就是错的。所以在标注质量评估中Kappa 必须与金标准或专家抽样复核配合使用不能单独下结论。4. 实操过程从数据构造到完整代码实现4.1 场景设计从零构造一个可复现的样本为了让整个过程更具体我设计一个项目场景训练两个文本分类模型——一个基于传统机器学习比如 TF-IDF 逻辑回归一个基于预训练语言模型比如 BERT 微调。测试集有 500 条样本类别是正负二分类。目标是先用 Kappa 评估两个模型输出的一致性再用 McNemar 检验确认两者在正确率上的差异是否显著。数据构造时我故意设计成“一个模型稍微好一点”的情况——现实中你当然不知道真实分布但为了演示我们可以设定 BERT 的准确率约为 84%逻辑回归约为 78%且两者在约 15% 的样本上会产生不一致的预测。这样构造出来的数据既能展示 Kappa 的数值也能让 McNemar 跑出一个显著的 p 值方便讲解整个分析流程。4.2 Python 代码实现手写核心逻辑不依赖黑盒实现 McNemar 和 Kappa 最稳妥的方式是用 Python 的statsmodels和sklearn.metrics它们都提供了现成实现。但为了让你理解底层逻辑我先给出核心部分的纯手写版本然后再给出封装调用。先定义预测结果数组y_true是真实标签y_pred_a是逻辑回归预测y_pred_b是 BERT 预测import numpy as np from sklearn.metrics import cohen_kappa_score, confusion_matrix rng np.random.RandomState(42) n 500 y_true rng.choice([0, 1], sizen, p[0.5, 0.5]) # 模拟两个模型BERT 准确率约 0.84逻辑回归约 0.78 def simulate_preds(y_true, acc): preds [] for t in y_true: if rng.rand() acc: preds.append(t) else: preds.append(1 - t) return np.array(preds) y_pred_a simulate_preds(y_true, acc0.78) # 逻辑回归 y_pred_b simulate_preds(y_true, acc0.84) # BERT接下来构造 McNemar 四格表。这里的 a、b、c、d 需要按上一节的语义重新排列# a: 两模型都正确 a np.sum((y_pred_a y_true) (y_pred_b y_true)) # b: A 正确B 错误 b np.sum((y_pred_a y_true) (y_pred_b ! y_true)) # c: A 错误B 正确 c np.sum((y_pred_a ! y_true) (y_pred_b y_true)) # d: 两模型都错误 d np.sum((y_pred_a ! y_true) (y_pred_b ! y_true)) table np.array([[a, b], [c, d]]) print(四格表:\n, table) # 输出类似[[301 53] # [ 95 51]]四格表里b53 是“老模型对但新模型错”的样本数c95 是“新模型对但老模型错”的样本数。一眼就能看出 BERT 的优势主要来自 c 明显大于 b。McNemar 检验直接用statsmodels.stats.contingency_tables.mcnemarfrom statsmodels.stats.contingency_tables import mcnemar result mcnemar(table, exactFalse, correctionTrue) print(statistic:, result.statistic) # 卡方值 print(p-value:, result.pvalue) # p 值exactFalse表示用卡方近似correctionTrue表示加连续校正。如果 b c 30我会把exactTrue打开此时会使用二项分布精确计算 p 值无需卡方近似。Cohens Kappa 直接用sklearn.metrics.cohen_kappa_scorekappa cohen_kappa_score(y_pred_a, y_pred_b) print(Cohens Kappa:, kappa)这段代码跑完Kappa 大约在 0.4~0.55 之间说明两个模型的一致性并不算高——这其实与预期相符因为两个模型的错误模式差异很大一个偏向误报正类一个偏向漏报正类。4.3 结果解读不要只贴一个 p 值假设上面代码输出四格表为 [[301, 53], [95, 51]]McNemar 卡方统计量约为 10.85校正后p ≈ 0.001Kappa 0.48。正确解读顺序应该是这样的先看 Kappa0.48 属于“中等一致”说明两个模型在大多数样本上输出一致但在接近 30% 的样本上存在分歧——Cohens Kappa 的数值本身不坏也不算好。接着看 McNemar 的 p 值约 0.001在 0.05 显著性水平下拒绝原假设说明两个模型在“谁对谁错”的不对称模式上存在统计显著的差异。最后结合 b 和 c 的方向判断c95 远大于 b53说明 BERT 在“老模型做错而新模型做对”的样本上明显更多因此 BERT 的优势具有统计显著性。严谨的写法是“两个模型的 Cohens Kappa 为 0.48显示中等水平的一致性McNemar 检验结果显著χ²(1) 10.85, p 0.001差异方向表明 BERT 在测试集上的优势真实存在。”如果你的业务不允许在结论里写 p 值至少也要报告“差异方向一致且超过随机波动”。4.4 小技巧用四格表诊断模型的错误模式McNemar 四格表除了做统计检验还是一个极其好用的错误诊断工具。b 格子代表“M1 对但 M2 错”c 格子代表“M2 对但 M1 错”。如果你把格子里的样本单独拉出来做错误分析往往能发现两个模型的系统性差异。比如在上述例子中c 格子的样本可能集中在某些长文本上说明 BERT 处理长文本的能力更强b 格子的样本可能集中在某些特定的领域词上说明逻辑回归在这个领域更保守。5. 常见问题与排查技巧实录5.1 问题速查表问题可能原因解决方案McNemar 的 p 值很大但 Kappa 很小两模型差异不显著但一致性也低说明错误模式分散且相互抵消检查四格表的 b 和 c 是否都很小如果都很小两模型输出几乎相同Kappa 不应小Kappa 0但准确率很高类别不平衡导致 Pₑ 极大Kappa 被压到接近 0或预测集中在多数类查看混淆矩阵和边缘分布必要时报告逐类精确率/召回率Kappa 为负值两评估者的判断存在系统性反向关系检查标签定义是否相反确认数据预处理是否一致如 0/1 编码互换McNemar 四格表里某个格子为 0b0 或 c0 时卡方公式可能不稳定改用二项精确检验若 b c 过小结论审慎多个评估者时误用 Cohens Kappa评估者数量超过 2改用 Fleiss Kappa或两两计算 Cohens Kappa 后求均值加权 Kappa 与普通 Kappa 差异巨大类别是有序的但未指定加权类型确认数据是否有序有序时始终选择线性权重或二次权重5.2 亲测有效的排查流程如果最终算出来的 Kappa 和 McNemar 结果互相矛盾我的排查顺序是先检查数据对齐问题。很多情况下“模型 B 的预测结果”和“模型 A 的预测结果”是按不同顺序排列的没有对齐到同一条样本上导致配对关系完全错乱。先用 Python 检查y_pred_a和y_pred_b的长度、顺序是否与y_true一一对应。再检查标签编码是否统一——一个模型输出 0/1另一个模型输出 -1/1这是最常见的“假不一致”来源。如果确认数据无误再检查类别分布。极度不平衡的数据会让 Kappa 的期望一致率接近 1从而把 Kappa 压到极低甚至负值。此时 McNemar 的四格表也会出现严重偏斜——对角线上的 a 巨大、d 趋近于 0。这种情况下的 Kappa 值缺乏参考意义我一般会改用 F1-score 或逐类精确率作为替代报告。5.3 我再补一个常规文档不会写的细节当你拿 Kappa 评估的是“模型输出 vs 人工标注”的一致性时人工标注本身往往也有噪声。一个更好的做法是让两个标注员独立标注同一批样本先计算标注员之间的 Kappa再计算模型与每个标注员之间的 Kappa。如果标注员之间的 Kappa 本身低于模型与标注员的 Kappa说明模型可能已经学到了比单个标注员更稳定的特征——这种情况在文本标注中并不罕见因为人类标注的注意力波动往往比模型更大。6. 工具选型与项目实战经验6.1 R 与 Python 的对比别被语言生态拖累实操 McNemar 和 Kappa 时R 和 Python 都有成熟实现。R 的mcnemar.test是一个基础包自带函数直接传 2×2 矩阵即可非常轻量irr包则提供了 Kappa 的各种变体Cohen、Fleiss、加权、多个评估者在传统统计报告流程中相当顺手。Python 这边statsmodels的mcnemar函数支持exact参数精确切换二项检验sklearn.metrics的cohen_kappa_score内置了加权选项生态同样完整。我的建议是如果你全职在做机器学习实验统一用 Python 就行因为数据清洗、建模、评测在同一个环境里流转不必为统计检验单开一个 R 进程。如果你的工作是偏临床研究或调查统计R 的irr包在处理多评估者 Kappa 时更顺手文档也更完善。两个环境的统计原理完全一致不涉及方法论差异。6.2 大样本时的注意事项与功效计算如果测试集很大比如十万条样本McNemar 检验几乎总能得到显著 p 值——样本量太大时统计显著性往往不等于实际意义。这种情况下建议同时报告效应量effect size。对 McNemar 来说可以用不一致样本中 b 和 c 的相对风险、优势比等指标体现差异的实际大小对 Kappa 来说置信区间confidence interval比点估计更有价值。计算 Kappa 的标准误需要用到 Delta 方法这对非统计背景的人来说有点难啃好在scikit-learn没有直接提供置信区间但statsmodels的proportion_confint可以辅助估算。我通常用 bootstrap自助抽样方法反复从样本中重抽样 2000 次计算每次的 Kappa最后取 2.5% 和 97.5% 分位数作为置信区间。这种方法不依赖额外包还能直观看到 Kappa 的波动范围。6.3 本项目可以用 R 复现的核验思路有时候我们需要双语言交叉验证一个统计结果避免单语言实现可能存在的小数舍入差异。用 R 复现的过程很简单# 构造同样的四格表 table - matrix(c(301, 53, 95, 51), nrow 2, byrow TRUE, dimnames list(M1 c(correct, wrong), M2 c(correct, wrong))) # McNemar 检验 mcnemar.test(table) # Cohens Kappa需要原始预测向量 library(irr) kappa2(data.frame(m1, m2))R 的输出与 Python 的statsmodels在大多数情况下是一致的。如果你发现 p 值略有差异往往是 Python 是否加了连续校正的问题——这个细节在写论文时需要注明否则审稿人无法复现。6.4 给新手的流程建议对于第一次接触这两个指标的朋友我建议的完整流程是先花半小时弄懂 2×2 列联表里 a、b、c、d 四个格子的含义再拿一组模拟数据手动算一遍 Kappa——这个手算过程能帮你真正理解 Pₑ 为什么要在公式里被扣除。然后跑通 Python 代码最后结合一个真实项目模型迭代对比、标注质量评估、诊断测试评估落实。不要一上来就套库函数否则你只是输出了一堆数字对数字背后的统计假设一无所知遇到 Kappa 悖论这类问题时会觉得“代码是不是写错了”。7. 最后再分享几个实操中的个人心得用了多年 McNemar 和 Kappa我最大的体会是统计检验的意义不在于证明“我有更强的模型”而在于帮你规避随机性带来的误判。我自己曾经历过一个场景两个模型的准确率差 0.8 个百分点看起来 B 模型更好但 McNemar 的 p 值是 0.27——后来换了更合理的超参数C 模型上线后稳定跑赢 B当初幸亏没因为 0.8% 的差距草率上线。第二个心得是Kappa 报告一定要带出边际分布。如果你的报告里只有一行“Kappa 0.63”别人根本看不出这两个评估者各自判了多少正类、多少负类。把混淆矩阵和边缘概率一起放上去既能说明 Kappa 是在什么分布下计算的也能帮你快速判断是否遇到了类别不平衡引起的 Kappa 悖论。第三个心得McNemar 的四格表可以用来做模型集成决策。如果你有两个模型的 b 和 c 都很大说明它们在不同样本上各有优劣这时集成两个模型比单独选一个更有潜力反之如果 b 和 c 都很小说明两个模型几乎在同样的样本上犯错做集成也不会有明显提升。这个用法是 McNemar 检验价值的重要延伸。最后给个小技巧无论你用的是哪个统计工具建议把所有相关代码整合成一个小脚本入参就是两个预测数组和对应的真实标签输出 McNemar p 值、Kappa 值、置信区间一步到位。我现在的所有模型对比实验都跑这个脚本配置好路径就能拿到完整统计报告既省时间也避免每次手算的失误风险。