首页 / 文章 / 你的评估通过率是98%,但置信区间可能算错了
← 返回
AI技术

你的评估通过率是98%,但置信区间可能算错了

✍️ zhirenhun 📅 2026/7/17 👁 17 阅读 ⏱ 19 分钟
你的评估通过率是98%,但置信区间可能算错了

你的评估通过率是98%?你的置信区间大概率是错的

摘要:几乎每一个 eval 工具在报告通过率时都会附带误差条(error bar),而这些误差条几乎全都来自正态近似法:p̂ ± 1.96 × √(p̂(1−p̂)/n)。这个近似法往往是错的。


问题何在

公式 p̂ ± z√(p̂(1−p̂)/n) 假定 p̂ 的抽样分布服从正态分布。根据中心极限定理(Central Limit Theorem),随着 n 增大,这个近似会越来越好。但一个常见的经验法则是:我们需要同时满足 np > 5 n(1−p) > 5,这个近似才算是合理的。

问题就在这里:对于 LLM 评估来说,许多基准测试只有 n=100~200 道题。如果模型达到了 98% 的准确率,那么 p=0.98,n(1−p) = 100 × 0.02 = 2。这个值小于 5。正态近似法失效了。


实际影响有多大

当 n=100 且 p̂=0.98 时,正态近似给出的 95% 置信区间为 [95.3%, 100%]。但如果使用精确的 Clopper-Pearson(二项分布)方法,实际的 95% 置信区间是 [92.9%, 99.8%]。这个区间比正态近似给出的要宽得多。

实际意义:如果有人报告说"98% ± 2.7%"——来自一个 100 道题的评估——那么真正的 95% 置信区间很可能是 [92.9%, 99.8%],远宽于 ±2.7%。真实通过率可能低至 92.9%。


更好的替代方案

以下三种方法都比正态近似(Wald 区间)更可靠:

1. Clopper-Pearson 区间(精确二项分布法):保证至少有 95% 的覆盖率,但偏保守——实际覆盖率可能高于 95%。

2. Wilson score 区间:覆盖率优于正态近似,被广泛使用,在边界附近表现良好。

3. Jeffreys 区间:基于贝叶斯 Beta 先验,通常具有良好的频率学派性质。


Python 代码示例

from scipy import stats
import math

def clopper_pearson_ci(k, n, alpha=0.05):
    # k 次成功,n 次试验
    lo = stats.beta.ppf(alpha/2, k, n-k+1)
    hi = stats.beta.ppf(1-alpha/2, k+1, n-k)
    return lo, hi

def wilson_ci(k, n, alpha=0.05):
    p = k/n
    z = stats.norm.ppf(1-alpha/2)
    denominator = 1 + z**2/n
    center = (p + z**2/(2*n)) / denominator
    margin = z * math.sqrt((p*(1-p)/n + z**2/(4*n**2))) / denominator
    return center - margin, center + margin

# 示例:100 道题中答对 98 道
print(clopper_pearson_ci(98, 100))  # (0.929, 0.998)
print(wilson_ci(98, 100))  # (0.931, 0.996)

详细的数值对比

当 n=50、49/50 正确时,来看看不同方法之间的差异:

49/50 通过(点估计 = 0.980)
  Wald(手算):       [0.9412, 1.0188]  宽度=0.0776
  Wald(statsmodels):[0.9412, 1.0000]  宽度=0.0588
  Wilson:             [0.8950, 0.9965]  宽度=0.1014
  Clopper-Pearson:    [0.8935, 0.9995]  宽度=0.1060

50/50 通过(点估计 = 1.000)
  Wald(手算):       [1.0000, 1.0000]  宽度=0.0000
  Wald(statsmodels):[1.0000, 1.0000]  宽度=0.0000
  Wilson:             [0.9287, 1.0000]  宽度=0.0713
  Clopper-Pearson:    [0.9289, 1.0000]  宽度=0.0711

不同真实 p 值下的实际覆盖率(名义 95% 置信区间,n=50):

 真实 p    Wald   Wilson   Clopper
   0.50    0.935   0.935    0.967
   0.80    0.938   0.951    0.967
   0.90    0.879   0.970    0.970
   0.95    0.920   0.962    0.988
   0.98    0.635   0.922    0.982
   0.99    0.395   0.911    0.986

注意:当 p=0.98 时,Wald 区间的实际覆盖率只有 63.5%,远低于声称的 95%。而 Wilson 仍维持在 92.2%,Clopper-Pearson 则为 98.2%。

关于库的两点说明:在 statsmodels 中,method="beta" 指的是 Clopper-Pearson(因其底层使用 Beta 分布计算而得名——这个命名选择曾让我浪费不少时间)。在 scipy 中,同样的区间可以通过 binomtest(k, n).proportion_ci(method="wilson")method="exact"(对应 Clopper-Pearson)获得。我对照检查了两个库以及手算的 Wilson 公式,三者精确到机器精度级别都保持一致。


我现在怎么做

Wilson 是默认选择。一个关键字参数,无需新依赖,在边界处行为正确,覆盖率在 eval 结果实际分布范围内接近名义水平。

Clopper-Pearson 用于以下情况:外部人员会依赖这个数字,或者高估可靠性的代价是非对称的(安全过滤器、任何涉及合规性要求的场景)。它被称为"精确"方法,因为它直接对二项检验求逆而非近似,但请注意上表显示其覆盖率在名义值为 0.95 时达到了 0.982 和 0.986。它是保守的,其区间比严格需要的更宽。这是一个刻意的权衡,而非免费的升级。Agresti 和 Coull 在 1998 年的论文 "Approximate Is Better than 'Exact' for Interval Estimation of Binomial Proportions"(Agresti and Coull, 1998, The American Statistician 52(2), 119–126)中已经论证过这一点:保证保守不等于准确,如果你想要接近 95% 而非高于 95% 的覆盖率,近似方法反而做得更好。

报告区间而非点估计。"98%"和"98%(95% CI [89.5, 99.7])"是同一个测量值,但只有后者传达了"五十道测试题就是五十道测试题"这个信息。如果你得到的区间太宽以至于无法支撑你的决策,答案是增加测试题数量,而区间宽度大致告诉你要加多少。

不要将下限解读为悲观情况。它是一个合理范围的边界,而不是下限。我曾在生产环境中犯过这个错误,结果花了一周时间寻找一个分布偏移来解释我缺失的那九个点中的三个。


常见问题(FAQ)

问:如果我的通过率在 70% 左右,这个问题还重要吗?

不太重要。当 n=50、p=0.80 时,Wald 精确覆盖率为 0.938(名义值 0.95),这是一个真实但可容忍的误差。当 p=0.50 时为 0.935。Wald 区间正是为这个范围设计的,表现尚可接受。问题在于,70% 的通过率通常意味着你还在修复系统,而不是在发布报告——等到你真的把数字写进文档时,它已经跑到 95% 或更高了。这个方法在你项目越成功时表现得越差,这对一个测量工具来说是个不幸的特性。

问:Wilson 永远比 Wald 好吗?

并非永远如此,我不想过度推销它。当 p=0.50、n=50 时,两者覆盖率完全相同(0.935),因为在中心区域两种推导近乎重合。Wilson 的优势出现在极端值和 n 较小时,并且随着你向边界移动而增长。在我所知的范围内,没有任何场景下 Wilson 明显更差,所以"始终使用 Wilson"是一个可辩护的默认策略,尽管"Wilson 永远更好"这个说法过于绝对。诚实的说法是:Wilson 在任何重要的方面都不比 Wald 差,而且在你最需要它的地方表现得远超 Wald。

问:为什么不直接把 Wald 区间截断到 [0, 1] 就行了?

因为截断改变不了任何实质性的东西。我在上面已经展示过了:将上界从 1.0188 截断到 1.0 只是从区间中排除了大于 1.0 的值,而没有任何真实比例会落在那里。截断前后的覆盖率逐位相同。截断所做的是移除了可见的症状——那个本来会提醒你检查方法的荒谬数字。statsmodels 默认对 normal 和 agresti_coull 方法进行截断,这意味着在 Python 中计算 Wald 区间最常见的方式,恰恰也是隐藏其最明显错误的方式。

问:具体到 50/50 全对的情况,有什么区间是合理的吗?

Wilson 和 Clopper-Pearson 都能处理,当 n=50 时分别返回 [0.9287, 1.0] 和 [0.9289, 1.0]。两者都在表达同一个合理的信息:连续五十次通过确实是对高通过率的有力证据,但它也与约 93% 的真实通过率一致。Wald 返回 [1.0, 1.0],声称绝对确定。如果你的评估仪表盘曾经显示过完美分数却没有误差条,或误差条宽度为零,这就是原因——值得在你的代码库中 grep 一下。

问:既然 Clopper-Pearson 是"精确"方法,是不是更安全的选择?

"精确"描述的是构造方法,而非覆盖率。Clopper-Pearson 直接对二项检验求逆而非近似,这保证了覆盖率至少达到 95%。但它会过度覆盖:在上表中,p=0.98 时为 0.982,p=0.99 时为 0.986,而名义值为 0.95。你为这个保证付出了区间宽度的代价,而宽区间自有其代价——一个太宽以至于无法区分两个候选模型的区间对你的决策毫无帮助。当低估可靠性的代价低于高估时,使用 Clopper-Pearson。否则用 Wilson。

问:同样的问是否会影响我基于每个指标报告的标准误差?

是的,对于任何本质上是"成功次数/试验次数"的指标都适用。通过率、精确匹配准确率、工具调用有效性、拒绝率,以及任何在测试集上聚合的二分类评估者判断。如果报告的数字是 k/n,误差条是 p̂ ± z·√(p̂(1−p̂)/n),本文的分析完全适用。但它不适用于连续评分指标的均值,比如跨个案平均的 1~5 分评级,它们有不同的(且通常表现更好的)抽样分布。

问:我明天应该在实际代码中改什么?

搜索 sqrt(p * (1 - p) / n)proportion_confint( 且没有显式 method 参数的地方(因为 statsmodels 默认 method="normal")。这两种都是 Wald 区间。将默认值改为 method="wilson"。这就是全部迁移工作。如果你有历史 eval 数据且已发布过区间,点估计不受影响,只有区间会变化,所以回填成本很低,而且主要会是拉宽旧的下限。


未解决的问题

我尚未解决的一个问题是:当评估集不是随机样本时该怎么办——而这种情况占了大多数。

以上所有分析都假设 n 次独立的 Bernoulli 采样来自一个固定的分布。但真实的评估集是精心挑选的。我们会加入那些曾经让模型出错的案例,保留那些难度高的案例,按文档或对话对案例进行分组以至于样本之间存在相关性而非独立性。在精心挑选的条件下,二项分布模型是错误的可能性模型,从中推导出的区间(包括 Wilson)回答的是一个不存在的总体的问题。Wilson 给出了一个正确的区间,但对应的是错误的模型。这比 Wald(错误的区间 + 错误的模型)要好,但我注意到,这个改进其实没有本文前面暗示的那么大。

我见过三种应对方式:

第一种:将评估集视为整个总体,不报告任何区间——这很诚实,但放弃了泛化能力。

第二种:在文档或对话层面进行聚类自助法(cluster-bootstrap)——这能处理相关性,但处理不了精心筛选问题。

第三种:维护一个独立的、未经筛选的随机样本专门用于估计——这方法正确,但我从未见过有人真的配了资源去做。

我没有第四个经得起推敲的答案。如果你在这方面有成功的实践,我很想拜读。


原文出处:Your eval pass rate is 98 percent. Your confidence interval is probably wrong. — Maya Andersson on DEV Community

🧑‍💻

zhirenhun

一个热爱技术的程序员,喜欢分享前沿AI知识和开发经验。

AI评估 置信区间 机器学习 统计学 LLM评估
← 上一篇
用经典机器学习检测LLM生成的文本(AIGC文本检测)

📌 相关推荐

用经典机器学习检测LLM生成的文本(AIGC文本检测)
2026/7/17
Kimi K3:开放前沿智能
2026/7/17
如何阻止Claude说“承重”之类的话
2026/7/15
← 返回文章列表