跳转至

P4-6.4 补充学习:评估指标的问题地图

Section ID: P4-6.4 Version: v2026.07.24

副标题: ROC、PR、log loss、calibration、silhouette 分别回答什么评估问题?

在 P4-6.1 和 P4-6.2 里,我们先抓住了评价指标的作用,以及按问题类型区分的差异。但是,只要开始读实际文档或库文档,很快就会碰到更陌生的名字。

  • ROC curve
  • PR curve
  • log loss
  • calibration
  • silhouette score

这段补充学习的目的,不是去长篇计算公式。目的是把这些指标 到底是在回答什么问题 接起来。

本补充学习的范围

这一节是第一次读 ROC、PR、log loss、calibration、silhouette 的补充学习,它们经常出现在分类和聚类里。这里比起细节证明,更专注 什么时候会看到它们,为什么会看到它们

  • 为什么 ROC 和 PR 曲线会接到 score 与 threshold 的问题上?
  • 为什么 log loss 会让人不只看对错,还要一起看概率输出?
  • 为什么 calibration 会让人重新怀疑 看起来像概率的分数
  • 为什么 silhouette 会让人在 clustering 里即使没有标准答案,也还能去读结构?

这一节先收束一个问题:为什么在阅读评价指标时,ROC、PR、log loss、calibration、silhouette 这些名字会分别出现。ROC/PR 和 calibration 会在 P4-15.3 再次出现,cluster 结构读取与 silhouette 的连接会在 P4-17.1、P4-17.2 继续展开。

用补充学习:第一次如何读 ROC、PR、对数损失(log loss)、校准(calibration)、轮廓系数(silhouette)恢复的概念连接

  • 能说明 ROC 和 PR 曲线是通过改变 threshold 来读取分类性能的工具。
  • 能说明 log loss 是连概率输出的自信程度也一起读取的指标。
  • 能把 calibration 解释成分数和真实频率是否匹配。
  • 能把 silhouette score 解释成同时看 cluster 内部紧密度与 cluster 之间分离度的内部标准。

先抓住大地图

这五个名字,其实分别在回答不同问题。

项目 先读的问题
ROC curve 如果改变区分正负类的标准,会发生什么变化?
PR curve 在正类稀少的情况下,precision 与 recall 的平衡会怎样变化?
log loss 不只是对错,而是错的时候到底有多过度自信?
calibration 0.8 这样的分数,现实里真的大约意味着 80% 频率吗?
silhouette 即使没有答案 label,分组是不是仍然紧密且分离?

也就是说,这些指标会在 accuracy 一个指标不够用的时候 出场。

如果把这一节的角色再压缩一点,它就是 在读正文评价问题时,暂时需要更细分的读分数标准时,绕进来一下的地方

当前卡住的问题 在这段补充学习里先看什么 要回去的正文位置
分类分数看懂了,但 threshold 一变会有什么不同? ROC, PR P4-6.2, P4-15.3
accuracy 看起来还行,但概率分数本身能不能直接信? log loss, calibration P4-6.2, P4-15.3
做出了 clustering 结果,但没有答案 label 时还能不能读结构? silhouette P4-17.1, P4-17.2

这些补充指标会被拿出来,是以 当前问题是不是正文里的指标已经足够,还是需要更细的读取框架 为标准。

当前问题 这一节先看什么 原因
threshold 一变,FP/FN 平衡会怎样变化? ROC, PR 因为分类分数和 threshold 变化会一起移动
概率分数的自信程度本身能不能信? log loss, calibration 因为只看对错还不够看概率解释
没有答案时,cluster 结构是不是像样? silhouette 因为需要另外的内部结构标准

所以,这一节不是取代正文的新评价章,而是用来更细地读取正文里已经立好的 按问题类型分开的问题 的绕行节。在这里把名字和问题接上之后,再回到正文里的分类、聚类、threshold 调整场景去读,会最自然。

第一次读时,不只要抓住 这个指标能告诉什么,也最好一起抓住 它单独还不能告诉什么

名字 它主要告诉什么 它单独还不能充分告诉什么
ROC 整体区分能力的全景 实际运营里该选哪个 threshold
PR 正类决策质量的变化 分数本身能不能像概率一样被信任
log loss 概率输出是否过度自信 高分是否和真实频率一致
calibration 分数解释的可信度 model 是否把正负类区分得好
silhouette cluster 结构的内部质量 这个 cluster 在实际业务解释上是否有用

先抓住这张表,后面看到这些看起来很像的名字时,就不容易只记住名称差异,而忘掉判断层位的差异。

ROC 和 PR 曲线会把 threshold 问题显露出来

在 P4-6.2 里,我们说过 classification 不只是把类别猜对,还包括怎样把分数变成决策。ROC 和 PR 曲线,就是让这一点可以被读出来的工具。

ROC 和 PR 曲线会显示:只要把 model 给出的分数,从哪个值开始当正类这件事改掉,误报与漏报的平衡也会一起变。

ROC curve 会用 false positive rate 和 true positive rate 来显示这个平衡。PR curve 则用 precision 和 recall 来显示。

之所以要把两者分开读,原因如下。

工具 特别有用的场景
ROC curve 想看整体区分能力的时候
PR curve 正类很稀少,而且 precision-recall 平衡特别重要的时候

例如,在 fraud detection、disease screening、anomaly transaction detection 这类正类比例很低的问题里,PR curve 往往会更直观。

初学者很容易漏掉的一点是:曲线看起来不错 这句话,还没有帮你把决策规则做完。ROC 和 PR 会显示 model 对分数的区分能力到什么程度,但到了实际 service 里,还是必须决定到底在哪个 threshold 上切分成 block、review、pass。也就是说,曲线不是代替决策的答案,而更像是一张让人讨论应该从哪里切开的地图。

读这两条曲线时,如果先按下面这个问题顺序来读,就不容易混乱。

先看的问题 从 ROC 这边读到的感觉 从 PR 这边读到的感觉
model 整体上有没有把正负类分开的能力? 看 TPR 和 FPR 的整体平衡 它不直接回答,但能看到 recall 的变化
在正类稀少的现实里,正类决策质量还撑得住吗? 在类别不平衡场景下直觉会变弱 因为 precision 一起出现,所以更直接
threshold 稍微往下调一点,会先摇到什么? 看 FPR 会不会很快上升 看 recall 上升时 precision 会掉多少

也就是说,ROC 往往更像在展示 整体区分能力全景,而 PR 往往更直接在展示 正类决策的成本结构

把 ROC 和 PR 接到真实判断上

即使是同一个 model,只要 threshold 放的位置不同,运营结果就会差很多。

  1. 一般来说,threshold 调高,正类判定会更谨慎,FP 可能减少。
  2. 但这样也会让 FN 增加,也就是漏掉更多真正正类。
  3. threshold 调低后,recall 可能会上升,但 precision 可能会急剧变差。

因此,ROC 和 PR 不只要和 model 分数看起来还行吗 一起读,还要和 这个业务到底更承受不了哪一种错误 一起读。若是 spam 拦截,更重要的可能是不要让正常邮件错误过多;若是疾病筛查,更重要的可能是尽量少漏掉风险案例。

用一个很小的数值场景来读,会更直观。

threshold 变化 precision recall 读起来的感觉
0.80 0.94 0.41 警报很谨慎,但漏得很多
0.50 0.82 0.73 可能是一个相对平衡的点
0.20 0.48 0.93 几乎都抓到了,但误报负担变大

这张表说明:ROC 和 PR 不是在简单说 好/坏,而是在帮助读 在什么成本结构下,哪个 threshold 更合适

ROC 和 PR 不能独自回答的问题

即使 ROC 和 PR 很有用,它们也不能独自解决下面这些问题。

  • 0.82 这个分数,真的可以直接读成 82% 风险吗?
  • 高分案例那一组,实际危险比例是不是也差不多这么高?
  • 改完 threshold 以后,人工复核人力、客户不满、运营成本到底会增加多少?

也就是说,ROC 和 PR 能帮助启动决策边界讨论,但它们并不会把分数解释的可信度一口气讲完。

log loss 会连概率输出的自信程度一起看

accuracy 先看的是对了还是错了。但有些 model 可能 虽然答对了,却非常没有把握;反过来,也可能 答错了,却非常自信

log loss 正是为了读这个差别而出现。

log loss 会把答错视为问题,但如果是用非常高的概率去说错,它会惩罚得更重。

也就是说,log loss 会让 classification 变成 连概率输出也一起评价 的读取方式。

所以,log loss 会和下面这些问题更自然地接上。

  • 这个 model 只看对错就够了吗?
  • 还是说,连分数的自信程度也应该一起看?

之所以需要这个指标,是因为即使是 同样答对了,答案质量也可能不同。比如两个 model 都把正答类猜对了,但一个给 0.51,另一个给 0.95,那它们在后面的 threshold 调整、排序、后续决策里的用处就会不同。

还有更危险的场景。

情况 如果只看 accuracy log loss 会更敏感地看到什么
用 0.51 勉强答对 会被算成答对 因为把握很弱,不会给高评价
用 0.55 答错 会被算成答错 看作答错了,但过度自信还不算特别严重
用 0.99 答错 也只是答错 会把它当成非常危险的过度自信来重罚

所以,log loss 不只是在问 错没错,它还在问 错得有多危险

什么场景下更该先想起 log loss

  • 当预测概率会被直接拿去排序、排优先级、做自动批准标准时
  • 当后面还很可能调 threshold,因此分数本身的质量很重要时
  • 当 accuracy 一样,但需要分辨哪个 model 给出的分数更值得信任时

这些场景下,只看 accuracy 和 F1 往往不够,还必须更细地读概率输出的样子。

再加一个简单对照,意图会更清楚。

model accuracy 正答类概率例子 读起来的感觉
模型 A 0.90 像 0.51、0.54、0.58 这样勉强答对 虽然答对,但分数把握很弱
模型 B 0.90 像 0.88、0.91、0.95 这样很明确地答对 即使 accuracy 一样,也更容易接到后续决策

也就是说,log loss 有助于分辨:在同样的正确率下,哪个 model 的分数更值得信任。

但 log loss 也不能单独解决一切。即使 log loss 很低,也不能立刻说 如果分数是 0.8,就真的有 80% 这么高。这个问题还得再用 calibration 去确认。

calibration 会看分数和真实频率是否匹配

就算 model 说了 0.82,也不代表现实世界里这个分数就一定精确对应 82% 的频率。calibration 就是在看这个差距。

calibration 这个视角会问:把相近分数的案例聚在一起之后,这个分数和真实发生频率是不是差不多。

例如,如果拿到 0.8 左右分数的 100 个案例里,大约有 80 个是真正正类,那就可以读成 calibration 还比较吻合。如果只有 40 个,那这个分数的解释就要更小心。

这个视角在下面这些场景里尤其重要。

  • 把风险分数当作优先级来使用的服务
  • 概率解释会直接接到决策上的场景
  • 定 threshold 时,必须相信分数大小本身的场景

因为 P4-15.3 还会再回到 threshold 调整和 calibration,所以这一节先把 看起来像概率的分数,也必须重新检查 这个视角接上。

初学者尤其容易混淆的是:分类做得好概率说得好 并不是同一种能力。有些 model 也许能把正负类排得比较有顺序,但分数值本身仍可能和实际频率不符。也就是说,ranking 可能还行,但 probability interpretation 可能很差。

像下面这样区分,会更清楚。

问题 更接近的工具
能不能把谁更危险按顺序排出来? ROC、PR 这样的区分视角
0.8 这样的数字,真的能当 80% 来读吗? calibration 视角

例如,如果只把 0.8 以上风险分数的案例交给人审,那么运营方关心的不只是 风险排序大体对不对,还会想知道 0.8 以上这一组,现实里是不是真的属于高风险群体。这时,calibration 就会直接连到 threshold 政策、人力配置和对客户的可解释性。

不要轻率误解 calibration

calibration 好,并不自动代表分类性能就好。反过来,分类性能好,也不保证 calibration 就好。

  1. 可能存在很会区分,但概率解释过度夸张的 model。
  2. 也可能存在概率看起来像样,但实际区分能力很弱的 model。
  3. 所以,现实里必须把 会不会区分分数解释准不准 分开来看。

用一个短对照场景来看,可以这样读。

分数区间 model 说的正类概率 实际正类比例 calibration 读法
0.8 附近案例组 大约 80% 大约 78% 比较吻合
0.8 附近案例组 大约 80% 大约 43% 这个分数过度自信

这个差别不只是一个小数值误差,它会摇动很多实际决策:该选多少人工复核对象、如何向客户解释风险分数、threshold 应该放在哪里。

反过来,即使 calibration 看起来不错,也还没结束。因为分数解释可能很准,但真正把正负类分开的能力仍然可能弱。所以,calibration 是看 概率口吻是否可信 的工具,并不是代表整个分类问题的万能分数。

silhouette 是在没有标准答案时读取 cluster 结构的内部标准

我们在 P4-6.2 里已经看过,在 clustering 里可能根本没有答案 label。silhouette score 就是这种场景下经常出现的内部评价标准。

silhouette score 是一种标准:同一个 cluster 里面越近、和别的 cluster 越远,就越像是更好的分组。

silhouette 可以理解成:同时比较 和自己 cluster 的接近程度和最近其他 cluster 的距离

所以,silhouette 有助于下面这些问题。

  • 当前分组是不是混得太厉害?
  • 如果 cluster 数改变,结构会不会变得更好?

因为 P4-17.1 和 P4-17.2 还会再遇到 clustering 结果解释和 cluster 质量指标,所以这里先把 即使没有答案,也能读结构的内部标准 这个点固定住。

读 silhouette 时,最好暂时放下读分类指标时的习惯。因为在这里,首先问的不是 到底对了多少答案,而是 这个分组本身看起来是否自然

下面这个问题顺序会有帮助。

问题 silhouette 为什么能帮忙
同一个 cluster 里的样本是不是没有离得太远? 它反映 cluster 内部紧密度
最近的其他 cluster 是不是足够远? 它反映 cluster 之间分离度
cluster 数增加或减少时,结构有没有变得更好? 它能作为内部结构比较标准

但 silhouette 也不是万能的。即使数值高,也不保证这个 cluster 在真实业务解释里就一定有用。例如,购买模式被非常干净地分成三群,也不能立刻说它们就是 好 cluster,如果这些分组根本接不到营销策略或运营政策。

所以,silhouette 先帮助的是 从数学上看,这个分组是不是整齐,但它并不会单独回答 从业务上看,这个分组是不是有用

最好也一起记住这个短对照场景。

cluster 结果 silhouette 读法 紧接着会来的下一个问题
cluster 内部紧密,彼此分离良好 结构看起来比较像样 能给这组分群贴上名字吗?
cluster 之间重叠很多 结构看起来不稳定 是 cluster 数不对,还是特征构成有问题?
数值高,但解释很模糊 数学分离还可以 这是不是能接到实际工作的分群标准?

正因为这样,silhouette 通常很适合作为 第一道内部检查工具,但它不会变成最终解释负责人。clustering 最后还是要走到 人能给这组分群读出什么名字,才能接到真正使用上。

即使在同一个问题里,问题也会分叉

即使只看 fraud detection 这种一个 classification 问题,问题也会像下面这样分成几条线。

同一个问题里的细分提问 更该先拿出的名字 原因
如果把阻断 threshold 从 0.7 降到 0.5,会发生什么? ROC, PR 因为 FP/FN 与 precision/recall 的平衡都会一起动
如果 accuracy 一样,哪个 model 错得更危险、更自信? log loss 因为想更重地看过度自信的错答
风险分数 0.8 能不能直接写进政策? calibration 因为必须确认分数与真实频率是否吻合
客户类型分组是否真的形成了结构? silhouette 因为得先看没有答案 label 的内部结构

也就是说,一个问题里有很多指标,并不是在说它被无端复杂化了,而是在说:即使是一个问题,里面也会有不同层位的判断。

再按不同层位把这五个指标重新捆起来

如果把到这里的内容再压缩一次,这五个名字并不是同一种指标。

指标 更接近的层位 核心问题
ROC, PR 分类分数与 threshold 调整 应该在什么地方把分数切成决定?
log loss 概率输出质量 错的时候,到底有多危险地过度自信?
calibration 分数解释的可信度 0.8 这样的数字,到底能信多少?
silhouette cluster 结构的内部质量 即使没有答案,这个分组也像样吗?

也就是说,ROC 和 PR 会在 决策边界移动时 出现,log loss 会在 要看概率自信时 出现,calibration 会在 必须相信概率解释时 出现,而 silhouette 会在 要读没有答案的结构时 出现。

只要不把这些层位混在一起,即使在同一个 classification 问题里,也能把问题拆开来读。

同一个 fraud detection 问题里的提问 先拿出的工具
该在哪个位置把分数切成阻断标准? ROC, PR
这个 model 在答错时是不是太自信? log loss
风险分数 0.8 真的能当成 80% 来读吗? calibration
高风险客户分组是否真的形成结构? silhouette

不必一次把这五个名字都背住

真正重要的不是背指标名字,而是把它们和问题接起来。

问题 对应的名字
改 threshold 会发生什么? ROC, PR
概率输出是不是太自信? log loss
分数和真实频率匹不匹配? calibration
没有答案 label 时,分组结构是不是还像样? silhouette

也就是说,这些指标全都是在 accuracy 一个不够用的时候 才被拿出来的工具。

案例与示例

案例 1. fraud detection 分数很高,但真实运营判断还是摇晃

支付系统正在给每一笔交易打一个 fraud 风险分数。人最先使用的标准,是 是不是海外支付是不是和平常不同的时间段是不是在很短时间里尝试了很多次 这样的信号。

在只用 accuracy 和 recall 比较 model 的阶段,一走到真实运营,就会出现更复杂的问题。有的 model 看起来正负类分得不错,但只要 threshold 稍微一动,误报就会剧增;有的 model 会给出很多 0.8 这样的概率分数,但实际上那些案例并没有那么危险。再把客户按 cluster 分组时,人又会想另外看看高风险交易是否会聚到某些分组里。

这时,ROC 和 PR 会让人读出 threshold 变化时到底动了什么,log loss 会让人读出答错时到底有多过度自信,calibration 会让人检查分数本身到底能信多少,而 silhouette 会在没有答案 label 的客户分组结构里出现。

flowchart TD
  A["欺诈风险分数"]
  B["调整阈值"]
  C["检查 精确率-召回率 的变化"]
  D["检查分数置信度"]
  E["检查分数与频率是否匹配"]
  F["检查无标签客户群组"]

  A --> B --> C
  A --> D
  A --> E
  A --> F

同样的判断,也可以用一小段代码输出确认。下面的例子会从同一组二分类概率输出里计算 ROC-AUC、PR-AUC、log loss、calibration bin,再在另一组小的 cluster 坐标上计算 silhouette。

import numpy as np
from sklearn.calibration import calibration_curve
from sklearn.metrics import (
    average_precision_score,
    log_loss,
    roc_auc_score,
    silhouette_score,
)

actual = np.array([0, 0, 0, 0, 1, 1, 1, 1])
probability = np.array([0.05, 0.25, 0.35, 0.80, 0.45, 0.65, 0.72, 0.95])

print("roc_auc=", round(roc_auc_score(actual, probability), 3))
print("pr_auc=", round(average_precision_score(actual, probability), 3))
print("log_loss=", round(log_loss(actual, probability), 3))

prob_true, prob_pred = calibration_curve(actual, probability, n_bins=3, strategy="uniform")
print(
    "calibration_bins=",
    [(round(float(p), 3), round(float(t), 3)) for p, t in zip(prob_pred, prob_true)],
)

points = np.array([[0.0, 0.1], [0.2, -0.1], [3.0, 3.1], [3.2, 2.9], [0.1, 0.3], [3.1, 3.3]])
cluster_labels = np.array([0, 0, 1, 1, 0, 1])
print("silhouette=", round(silhouette_score(points, cluster_labels), 3))

输出示例如下。

1
2
3
4
5
roc_auc= 0.812
pr_auc= 0.804
log_loss= 0.499
calibration_bins= [(0.15, 0.0), (0.483, 0.667), (0.823, 0.667)]
silhouette= 0.928

这个输出说明,指标名字变多是有原因的。ROC-AUC 和 PR-AUC 会从不同角度读取同一组概率排序,log loss 会把概率自信程度作为惩罚来读。calibration bin 让我们看到类似 看起来像 0.483 的分数组里,真实阳性频率是 0.667 这样的关系。silhouette 问的不是有没有对上答案 label,而是给定 cluster 内部是否紧密、彼此之间是否分开。

可检验的结果也会随着问题不同而不同。只要 threshold 一动,就要分别看 precision 和 recall 的摆动;只要看高风险分数组,就要确认它和真实欺诈比例是否吻合;只要看 cluster,就要单独看 cluster 里面的交易是不是真的彼此相似。所以,这些指标不该被读成 新名字,而该被读成对 更具体问题 的回应工具。

检查清单

  • 能不能说明在什么时候,该在正文的 accuracy/precision/recall 之后把 ROC 和 PR 拿出来?
  • 能不能说明为什么 log loss 和 calibration 会让人重新怀疑 看起来像概率的分数
  • 能不能说明 silhouette 在 clustering 里回答的是哪一种内部问题?
  • 能不能说明评价指标会变多,不是因为 model 更复杂了,而是因为我们提出的问题更具体了?
  • 能不能说明 ROC 和 PR 读的是 threshold 改变时的分类平衡,log loss 读的是概率输出的自信程度,calibration 读的是分数和真实频率是否匹配?
  • 能不能说明 指标很多 这句话,其实连着 好结果的含义不只一个

出处与参考资料