本文是《LLM 时代的经典机器学习:只讲它在哪里重现》系列的第 6 篇(共六篇)。上一篇:去重——MinHash 与 LSH 的概率

一切结论是否成立的最后一道关是评估。”过滤器准确率 95%”、”奖励模型准确率 78%”、”judge 与人类一致率 80%”、”在 20 个 benchmark 中的 12 个上领先”——这些数字各自在说什么、够不够、哪里会骗人,经典机器学习的评估方法论有一套完整的答案。这一篇从混淆矩阵的四个数讲起,到阈值的权衡、AUC、类别不平衡、校准、交叉验证、配对检验、多重比较,每一个都跑一个数字出来,并指出它在 LLM 评测里的陷阱。

全篇的核心问题是:

过滤器”准确率 95%”是什么意思?judge 与人类”一致率 80%”够不够?”20 个 benchmark 领先 12 个”算不算?

一、总览

1. 一张表

分类器好不好      混淆矩阵 → 精确率 / 召回率 / F1(依赖阈值)· AUC(不依赖阈值)· 校准(概率可信吗)
准确率会骗人      类别不平衡时 95.6% 是"全判负"的分数
估计稳不稳        交叉验证(数据少时)· 置信区间(L0 第八篇)
两个模型比        独立比较 vs 配对检验 · 多重比较
LLM 上的形态      过滤器的漏放与误杀 · 奖励模型的准确率 · judge 的一致性与系统偏差 · benchmark 的显著性

2. 本文的章节安排

主题 内容
混淆矩阵与四个指标 TP / FP / FN / TN;准确率、精确率、召回率、F1 各回答什么
阈值 同一个分类器 0.1 到 0.9 的表;要求召回 95% 的代价;AUC
类别不平衡 正例 3% 时准确率的陷阱
校准 说 80% 是不是十次八次对;ECE;哪些模型天然校准
奖励模型与 judge 准确率的上限;一致性与 kappa;三种系统偏差
交叉验证 300 条数据上单次划分 vs 5 折
两个模型怎么比 独立比较 vs 配对检验(McNemar);多重比较
自测 五道题
系列总结  

配套脚本:06_evaluation.py

二、混淆矩阵与四个指标

1. 四个数

二分类的结果是一张 2×2 的混淆矩阵

                    预测为正          预测为负
真实为正      TP(真正例,抓到了)   FN(假反例,漏掉了)
真实为负      FP(假正例,误杀了)   TN(真反例,放对了)

2. 派生指标

指标 定义 回答的问题 LLM 上的实例
准确率 \((TP + TN) / \text{全部}\) 总体对了多少 类别不平衡时会误导(第四章)
精确率 \(TP / (TP + FP)\) 判为正的里有多少真的是正 安全过滤:拦下来的里有多少真有害(误杀率 \(= 1 -\) 精确率)
召回率 \(TP / (TP + FN)\) 真正的正例抓到了多少 安全过滤:有害内容漏放了多少;污染检测:泄漏的题找到了多少
F1 精确率与召回率的调和平均 两者的折中 阈值不好定时的单一指标
AUC ROC 曲线下的面积 分类器把正负例排开的能力,与阈值无关 比较两个质量分类器本身的好坏

精确率与召回率是一对:精确率问”我说是的有多准”,召回率问”真的是的我抓了多少”。安全过滤器要召回(不能漏放),推荐系统要精确率(推的要准),数据质量过滤在两者之间。

三、阈值

1. 同一个分类器、不同阈值

分类器输出的是概率(L2 第二篇的 \(\sigma(w^T x + b)\)),”判为正”要一个阈值。同一个逻辑回归,阈值从 0.1 到 0.9——把它读成一个有害内容过滤器:

阈值    TP    FP    FN    TN   精确率   召回率     F1   含义
 0.1  1188   365    18   829   0.765   0.985  0.861   宽松:漏放少、误杀多
 0.3  1160   173    46  1021   0.870   0.962  0.914
 0.5  1131    98    75  1096   0.920   0.938  0.929
 0.7  1064    53   142  1141   0.953   0.882  0.916   严格:误杀少、漏放多
 0.9   870    18   336  1176   0.980   0.721  0.831
要求召回 ≥ 95%(漏放 < 5%)时阈值约 0.40,精确率掉到 0.904

阈值高,精确率高、召回率低;阈值低,反过来。 同一个模型,不同阈值就是不同的过滤器。要求”漏放不到 5%”(召回 ≥ 95%),阈值就得放到 0.4、接受精确率 90%(每 10 个拦下的有 1 个是误杀)。

数据过滤是这个权衡的直接应用——质量分类器阈值取高,留下的数据干净但少;取低,数据多但脏。FineWeb-Edu 按教育分 3 分切留下约 1.3T token,切在 2 分留下几倍多。这个决定没有标准答案,取决于你有多少数据、模型多大(L0 第八篇 Chinchilla 的 \(D / N \approx 20\) 告诉你至少要多少 token)。

2. AUC:不依赖阈值的指标

ROC 曲线是把阈值从 1 扫到 0,每个阈值画一个点(假正率,召回率)连成的线;AUC 是它下面的面积,取值 \([0.5, 1]\),0.5 是随机、1 是完美。它有一个直觉的解释:随机取一个正例一个负例,分类器给正例更高分数的概率

AUC 0.973(与阈值无关:随机取一正一负,正例分数更高的概率)

比较两个分类器本身(不是两个阈值)用 AUC;决定用哪个阈值用精确率 / 召回率。两件事不要混。

四、类别不平衡

1. 准确率的陷阱

正例只占 3%:

测试集 2400 条,正例 105 条;全判负的准确率 0.956
逻辑回归阈值 0.5:准确率 0.959,但召回率只有 0.105(漏掉 94/105 个正例);AUC 0.784
阈值降到 0.1:召回 0.533、精确率 0.253、准确率 0.911——不平衡时看 P/R/AUC,不看准确率

一个什么都不做、全判负的”分类器”准确率 95.6%。逻辑回归 95.9%——看起来更好,但它只抓到了 105 个正例里的 11 个。类别不平衡时准确率几乎没有信息:99% 的文本是”正常”,全判正常准确率就是 99%。

2. 该看什么、该做什么

看精确率 / 召回率 / AUC;把阈值从 0.5 挪开(上面挪到 0.1,召回从 10% 到 53%);训练时给少数类加权或重采样;报告时按类别分开报。LLM 上的对应:安全分类器(有害内容是极少数)、污染检测(泄漏的题是极少数)、过滤器对少数语体的误杀(上一篇)——全是不平衡问题,准确率在这些地方都不能看。

五、校准

1. 说 80% 的时候是不是十次八次对

一个分类器说”90% 是正例”,实际上是不是十次里有九次对?是,就叫校准良好(calibrated)。校准用可靠性图(把预测概率分成若干档,每档画预测概率的均值 vs 实际正例率,理想是对角线)和期望校准误差(ECE:各档的偏差按样本数加权平均)度量。

逻辑回归     AUC 0.947  ECE 0.026   预测 0.7–0.8 那一档的实际正例率 0.80
梯度提升     AUC 0.978  ECE 0.014   预测 0.7–0.8 那一档的实际正例率 0.83
SVM (概率)   AUC 0.978  ECE 0.016   预测 0.7–0.8 那一档的实际正例率 0.79

三个模型在这份数据上校准都不错(ECE 1–3%)。一般规律:逻辑回归天然校准好(它的 loss 就是对数似然,L0 第五篇——最大似然估计出来的概率就是频率);树模型与 SVM 的分数排序对但概率不准,要用 Platt scaling(在分数上再套一个逻辑回归)或 isotonic regression 校准。AUC 高不等于校准好——AUC 只看排序。

2. LLM 上的两处

  • 模型对自己答案的置信度:预训练后的模型校准通常不错(说 70% 的题大约 70% 对),RLHF 之后变差——模型学会了”自信”,对错都说 90%。这是后训练的一个已知副作用。
  • 奖励模型:分差 \(r_w - r_l\) 过 sigmoid 后应该等于人类偏好 \(y_w\) 的比例(L2 第二篇:它就是逻辑回归)。不等就是校准问题,会影响 RL 里奖励的尺度——\(\beta\) 的含义依赖 \(r\) 的尺度。

六、奖励模型与 judge

1. 奖励模型的评估是准确率

在留出的偏好对上,\(r_w > r_l\) 的比例就是准确率。典型值 65%–80%——看起来不高,但要记住 L2 第二篇的结论:标注员之间的一致率本身只有 70%–80%,奖励模型的上限是标注的一致性。RewardBench 一类基准按类别(对话、安全、推理)分开报准确率,就是 L1 第一篇 Pandas 那种”能力分解”。

2. judge 的评估是一致性

LLM-as-judge 的评估是一致性:judge 的判断与人类标注一致的比例,或 Cohen’s kappa(扣掉随机一致后的一致率——两个随机打分者在二选一上也有 50% 一致,kappa 把这个基线扣掉)。”一致率 80%”够不够,要跟人与人之间的一致率比:如果人与人也只有 78%,80% 已经到顶。

3. 三种系统偏差

要警惕的偏差都是经典评估里有名字的系统误差(第一篇:偏差,集成消不掉):

  • 位置偏差:先出现的回答得分高——对换顺序各评一次取平均;
  • 长度偏差:长回答得分高——控制长度、或在 prompt 里明确、或报”长度控制后的胜率”;
  • 自我偏好:judge 偏好与自己同源的模型——用不同家族的 judge 交叉。

多个 judge 取平均能降低随机误差(方差),但如果它们都偏好长回答,平均之后还是偏好长回答——系统偏差只能设计消掉

七、交叉验证

数据少时一次划分的分数抖得厉害:

300 条数据。5 次不同的单次 70/30 划分: [0.722, 0.722, 0.756, 0.722, 0.678](同一个模型,分数抖 0.078)
5 折交叉验证: 均值 0.763 ± 0.022——每条数据都当过一次验证,估计更稳,代价是训 5 次

交叉验证:把数据分成 \(k\) 折,轮流用一折当验证、其余训练,\(k\) 个分数取平均。同一个模型,单次划分在 0.68–0.76 之间乱跳,5 折给出 0.763 ± 0.022。LLM 上大模型不做交叉验证(训不起),但小规模实验、分类器训练、奖励模型的评估照常用——尤其是偏好数据只有几千对的时候。

八、两个模型怎么比

1. 独立比较 vs 配对检验

500 道题上模型 A 65.2%、模型 B 61.0%,差 4.2 个点:

独立比较:差值标准误 0.030,z = 1.38 → 不显著(|z| > 1.96 才显著)
配对比较:A 对 B 错 33 题、A 错 B 对 12 题,其余一致;McNemar z = 3.13 → 显著

独立比较(L0 第八篇)把两个正确率当成独立的估计,差值的标准误是 \(\sqrt{\text{SE}_A^2 + \text{SE}_B^2} = 3.0\%\),4.2 个点不到 1.96 倍——不显著。

配对检验利用了”同一套题”:两个模型答错的题高度重叠,455 题两者一致,差异全在 45 道分歧题上——33 道 A 对 B 错、12 道 A 错 B 对。如果两个模型一样好,分歧题应该一半一半(22.5 : 22.5);33 : 12 偏离一半的程度用 McNemar 检验:\(z = (33 - 12) / \sqrt{33 + 12} = 3.13\),显著。

同一套题上比两个模型,永远用配对——它只看分歧题,噪声小得多。但结论的量级不变:分歧题只有 45 道,再灵敏也分辨不出 1 个点的差异。

2. 多重比较

在 20 个 benchmark 上比两个模型,即使它们完全一样

2000 次模拟:两个完全相同的模型,5% 显著性水平下
  平均 0.92 个 benchmark 上'显著'不同(期望 20 × 5% = 1);至少一个显著的概率 61%
  '20 个里领先 12 个':随机情况下期望领先 10 个,标准差 2.2——12 个不算什么

5% 显著性意味着每个 benchmark 有 5% 的概率”碰巧显著”;20 个就期望 1 个、至少一个的概率 61%。所以论文里”在 20 个 benchmark 中的 12 个上领先”,先问:随机情况下期望领先 10 个、标准差 2.2,12 在一个标准差以内——不算什么。修正的方法:Bonferroni(显著性水平除以 benchmark 数)、或看平均分的置信区间而不是数领先个数、或预先指定一个主 benchmark。

九、自测

  1. 一个安全过滤器精确率 98%、召回率 72%。它每拦 100 条有几条误杀?每 100 条有害内容漏放几条?哪个指标更该关心?
  2. 两个质量分类器 AUC 分别 0.90 与 0.93,但在阈值 0.5 上前者 F1 更高。该选哪个?
  3. 正例 1% 的数据上分类器准确率 99.2%,说明什么?该看什么?
  4. 一个 judge 与人类一致率 82%,人与人之间一致率 80%。judge 够好了吗?还该检查什么?
  5. 论文在 15 个 benchmark 上报了结果、其中 3 个”显著领先”。随机情况下期望几个显著?这个结果可信吗?

答案要点:(1)2 条误杀、28 条漏放;安全过滤更该关心召回(漏放)。(2)AUC 高的那个模型本身更好,F1 的差别是阈值选择的问题——选 0.93 的,再选合适的阈值。(3)几乎没有信息(全判负就 99%);看召回、精确率、AUC。(4)随机一致已经到顶,但要检查系统偏差:位置(对换顺序)、长度(长度控制)、自我偏好(换家族)。(5)期望 0.75 个;3 个略多于随机但不强——看效应大小与平均分的区间,或做 Bonferroni(每个用 0.33% 的水平)。

十、系列总结

这是《LLM 时代的经典机器学习》的最后一篇。六篇走完,总纲里那张”重现表”的每一行都有了自己的数字:

什么是学习   三份数据、测试集只看一次 · 次数 25 训练 MSE 0.040 验证 0.313 · 在测试集上挑最好偏乐观 0.255
             误差 = 偏差² + 方差 + 噪声,集成只降方差 · 正则化 = 拉向简单解 · reward hacking = 在过拟合的评估器上优化

线性与逻辑   闭式解 vs 梯度下降差 1e-14 · Lasso 45/50 归零、Ridge = weight decay · σ(wᵀx+b) 是每个分类头的原型
             奖励模型 = 逻辑回归作用在 x_A − x_B 上、无偏置 · 准确率 91.5% = 标注上限 91.3%

分类器一家   七个模型同一份数据 83%–92% · 决策树训练 100% 测试 83% · GBDT 是表格数据默认
             8B 打分 = 训练算力的 1/3 → 大模型标少量、小模型过全部 · KNN 以检索的形式无处不在

无监督       K-Means 肘部 / 轮廓 · DBSCAN 月牙 ARI 1.0 vs 0.26 · 聚类是探索不是预测
             PCA = SVD:64 维 29 维解释 95% → 低秩直觉 · 各向异性让余弦失去含义

去重         Jaccard · MinHash 一行证明、k=128 时 ±0.04 · S 曲线 1 − (1 − s^r)^b
             FineWeb b=14, r=8 阈值 0.685 → "Jaccard > 0.7 算重复" · 200 万对 → 267 个候选

评估         阈值:召回 95% 时精确率 90% · AUC 不看阈值 · 不平衡时准确率 95.6% 是全判负 · ECE
             奖励模型上限 = 标注一致性 · judge 三种系统偏差集成消不掉 · 5 折 ± 0.022 · McNemar z=3.1 vs 独立 1.4 · 20 个 benchmark 61% 至少一个假显著

学完的标志不是记住算法,而是看到 LLM 上的一个问题能叫出它的经典名字:污染是测试集泄漏、reward hacking 是过拟合、judge 的长度偏好是系统误差、过滤器误杀是精确率召回率的权衡、”20 个领先 12 个”是多重比较。叫出名字,经典解法就在手边。

接下来是 L3《深度学习基础:从反向传播到残差》。那里的模型换成了神经网络,但过拟合、正则化、评估——全是本系列的概念换了一个模型;奖励模型、过滤器、judge——L5 与 L4 里每一个具体的东西,也都能在这六篇里找到它的骨架。

本文由 arganzheng 创作,采用 CC BY 4.0 许可协议。在保留原文作者、署名以及完整原文链接(https://arganzheng.life/evaluation-from-confusion-matrix-to-judge-agreement.html)的前提下,欢迎各种形式的转载、翻译或商业引用。


COMMENTS

评论存放在 GitHub Discussions, 用 GitHub 账号登录即可发表,支持 Markdown。 想针对正文某句话说?选中那段文字,点浮出的「评论」即可划线评论;觉得哪里写错了,发表时勾上「同时提交 Issue」。 有人回复你时 GitHub 会按你的通知设置发邮件,不用守在这里。

×