混淆矩阵
二分类混淆矩阵把实际类别与预测交叉,计数为真阳性 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 个百分点。
依次降低到阳性分数,观察新增命中的误报成本:
τ | TP | FP | 精确率 | 召回率 | 准确率 |
|---|---|---|---|---|---|
| 0.93 | 1 | 0 | 1.000 | 0.167 | 0.875 |
| 0.81 | 2 | 1 | 0.667 | 0.333 | 0.875 |
| 0.64 | 3 | 2 | 0.600 | 0.500 | 0.875 |
| 0.55 | 4 | 2 | 0.667 | 0.667 | 0.900 |
| 0.34 | 5 | 5 | 0.500 | 0.833 | 0.850 |
| 0.19 | 6 | 9 | 0.400 | 1.000 | 0.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%。真正的决策还要结合漏报与误报成本,这些输入不能由指标自己生成。