在大屏或电脑上体验更佳——动画和操作区域更宽敞。
输入

混淆矩阵

二分类混淆矩阵把实际类别与预测交叉,计数为真阳性 TP、假阳性 FP、假阴性 FN、真阴性 TN。准确率、精确率和召回率从这些计数计算;排序质量和概率校准还需要阈值之外的信息。

本课 40 个样本中,完全不报警也有 85% 准确率;全报警有满分召回率;只报分数最高的一例有满分精确率。这些单一分数都不足以判断系统是否有用,必须同时看四项计数、样本量和任务成本。

从分数到四格表

先有分数,再有决策。本课分数越高越倾向阳性。逻辑回归概率、树的叶节点频率或网络概率都可用作分数,但不能自动视为校准概率。选择阈值 τ,按 score ≥ τ 报警,才把排序变成预测。

  • TP:实际阳性,已报警,命中。
  • FP:实际阴性,已报警,误报。
  • FN:实际阳性,未报警,漏报。
  • TN:实际阴性,未报警,正确排除。

画布横轴为分数,线上方是实际阳性,下方是阴性;竖阈值线把它切成四区,再移入表格。矩阵只是已知标签与阈值判断的交叉计数。

准确率 = (TP + TN) / n

精确率 = TP / (TP + FP):报警中有多少是真的?

召回率 = TP / (TP + FN):真实阳性中抓到多少?

精确率不看 TN;召回率不看 FP、TN;准确率给每个错误相同代价,无法区分误报与漏报的后果。

逐步演示

默认 40 个留出样本:34 阴性、6 阳性,阳性率为 15%。阳性分数是 0.93、0.81、0.64、0.55、0.34、0.19。九个阴性不低于 0.20,最高 0.88;其余 25 个低于 0.18。

默认 τ = 0.50。前四个阳性通过阈值,TP = 4;后两个未通过,FN = 2。阴性的 0.88、0.72、0.52 误报,FP = 3,其余 TN = 31。准确率 (4 + 31)/40 = 0.875,精确率 4/7 = 0.571,召回率 4/6 = 0.667。

把阈值升到所有分数以上:TP = FP = 0、FN = 6、TN = 34。召回为零,精确率未定义,准确率为 34/40 = 0.850 = 1 − 阳性率。这个常量规则只比默认低 2.5 个百分点。

依次降低到阳性分数,观察新增命中的误报成本:

τTPFP精确率召回率准确率
0.93101.0000.1670.875
0.81210.6670.3330.875
0.64320.6000.5000.875
0.55420.6670.6670.900
0.34550.5000.8330.850
0.19690.4001.0000.775

第一次命中没有误报;第四次也没有新增误报,所以精确率从 0.600 回升到 0.667。第五次付出三个新误报,第六次又增加四个。阈值变化不一定同时改变两种错误,要看跨过的是哪类样本。

降到 τ = 0,全部报警:召回 1.000,精确率与准确率都为 6/40 = 0.150。全报时精确率恒等于样本阳性率。

本组准确率在 τ = 0.55 附近达到 0.900,在 0.44 回到常量规则的 0.850,到 0.38 首次低于它,0.34 再碰到一次 0.850,之后不再超过。0.19 是抓全阳性的最高阈值,更低的阈值也能抓全,但会增添误报。只追求最高准确率会选择漏掉六例中的两例。

单一指标隐藏了什么

规则看起来好的指标被隐藏的结果
从不报警准确率 0.850召回为零
全部报警召回率 1.000精确率只有 0.150
只报最高一例精确率 1.000召回率只有 0.167

若阳性仅占 0.3%,始终返回否就有 99.7% 准确率。本课把配置改为 36 例中 2 阳性,从不报警的准确率变为 0.944。代码未变,分数因类别比例而变。

降低阈值时 TP 不减、FN 不增,因此召回单调不减;精确率的分子分母都可能增长,新增样本的标签决定方向,所以精确率—召回率曲线可能呈锯齿。准确率对一个 FN 和一个 FP 都扣 1/40,而实际漏报与误报的代价可能不同。

如何选择阈值

先由任务确定约束,再在满足约束的候选中优化。作为计算示例,若要求召回率至少 0.80,再最大化精确率,表中 τ = 0.34 与 0.19 合格,前者精确率 0.500 高于 0.400,结果为五命中、五误报、一漏报。若要求精确率至少 0.65,再最大化召回率,则选 0.55。

这些门槛是例子,不是医疗或其他领域的推荐值。约束来自错误代价和可承受工作量,矩阵不能替你制定。实际阈值应在验证数据上选择,再用独立测试数据评估;40 例的结果也不足以证明部署表现。

边界情况

  • 没有报警:TP + FP = 0,精确率为 0/0,未定义。本课的精确率读数显示长破折号,不给数字。有些库按 zero_division 配置返回零或其他值,默认可能伴随警告;需要同时报告无预测阳性,不能把它解释成所有报警都错。
  • 没有实际阳性:召回同样未定义。配置至少两阳性,但小型交叉验证折可能发生此情况。
  • 分数等于阈值:使用 ≥,相等时报警;改成 > 会把该例 TP 变 FN,或 FP 变 TN。全部 58 个可用分数互不相同,不代表不会等于阈值;表中就使用分数作为阈值。真实分数常有并列,必须说明约定。
  • F1:2PR/(P+R),也可写 2TP/(2TP+FP+FN)。全报为 0.261,只报首例为 0.286,默认阈值为 0.615。它兼顾精确率、召回率,但不看 TN,公式对 FP、FN 使用相同系数,仍不能表示任意错误代价。
  • 特异度:TN/(TN+FP)。在 τ = 0.19 时为 25/34 = 0.735,同一组九个误报对应精确率却为 0.400,因为分母不同。
  • 轴序:sklearn.metrics.confusion_matrix 对 0/1 标签默认是 [[TN, FP], [FN, TP]]。本课实际阳性在上、预测阳性在右,以匹配分数图,所以 TP、TN 在反对角线上。先看轴标签,再读格子。

常见错误

  • 只报告准确率,不报告 n 与阳性率。阳性率 30% 时不报警基线为 70%,95% 时为 5%;本课 15% 时为 85%。相同准确率在各基线下含义不同。
  • 只优化召回。全报虽召回满分,却有 34/40 误报,还需精确率、特异度或工作量约束。
  • 把默认阈值看作训练排名模型不可改变的部分。阈值是决策策略的一部分,提高它可能减少误报,但要接受更多漏报。
  • 比模型 A 的 0.5 阈值与 B 的 0.3 阈值,却把全部差异归给模型。那是两个运行点的比较;可按相同召回、相同精确率或全阈值范围比较。
  • 只看计数或比例之一。六阳性中的四命中,与六千阳性中的四命中完全不同。

模型范围

分数与标签是为教学设计的固定数据,不是模型导出结果。输入是 (y_true, y_score),不展示评分模型训练。这里只有一个小留出集、二分类、未校准分数,没有置信区间、交叉验证或成本矩阵。

40 例的精确率估计可能很不稳定。多分类需 k×k 矩阵及逐类、宏观或加权指标。分数 0.9 不自动意味着真实阳性概率 90%。真正的决策还要结合漏报与误报成本,这些输入不能由指标自己生成。