草稿
精确率
衡量模型预测为正类时,有多少次是真的。
问题起点:报警该不该信?
你的模型给 12 封邮件打标签,spam 是告警。你关心的是:模型把一封邮件标成 spam 时,能信几成?
全部 12 封评估邮件
每封邮件都保留真实标签和模型预测。
立即领取奖品
明显的中奖诱饵,被过滤器拦下。
actual: 垃圾邮件(spam), predicted: 垃圾邮件(spam), TP: 真正例(true positive)
项目笔记
普通工作邮件,被留在收件箱。
actual: 非垃圾邮件(not-spam), predicted: 非垃圾邮件(not-spam)
收据已附上
真实收据被错误标成垃圾邮件。
actual: 非垃圾邮件(not-spam), predicted: 垃圾邮件(spam), FP: 假正例(false positive)
账户提醒
伪造提醒漏进了收件箱。
actual: 垃圾邮件(spam), predicted: 非垃圾邮件(not-spam)
限时优惠
促销垃圾邮件被正确拦截。
actual: 垃圾邮件(spam), predicted: 垃圾邮件(spam), TP: 真正例(true positive)
团队午餐
团队日常邮件被正确保留。
actual: 非垃圾邮件(not-spam), predicted: 非垃圾邮件(not-spam)
密码重置
用户请求的重置邮件正常送达。
actual: 非垃圾邮件(not-spam), predicted: 非垃圾邮件(not-spam)
紧急转账
诈骗邮件被过滤器漏掉。
actual: 垃圾邮件(spam), predicted: 非垃圾邮件(not-spam)
航班变更
有用的出行更新被误报。
actual: 非垃圾邮件(not-spam), predicted: 垃圾邮件(spam), FP: 假正例(false positive)
加密币奖励
可疑奖励垃圾邮件被正确拦截。
actual: 垃圾邮件(spam), predicted: 垃圾邮件(spam), TP: 真正例(true positive)
发票已批准
业务发票被正确接收。
actual: 非垃圾邮件(not-spam), predicted: 非垃圾邮件(not-spam)
验证钱包
钓鱼式钱包邮件被漏判。
actual: 垃圾邮件(spam), predicted: 非垃圾邮件(not-spam)
仅“预测为 spam”告警(5 条)
这 5 封邮件进入精确率分母:e1, e3, e5, e9, e10。
立即领取奖品
明显的中奖诱饵,被过滤器拦下。
actual: 垃圾邮件(spam), predicted: 垃圾邮件(spam), TP: 真正例(true positive)
收据已附上
真实收据被错误标成垃圾邮件。
actual: 非垃圾邮件(not-spam), predicted: 垃圾邮件(spam), FP: 假正例(false positive)
限时优惠
促销垃圾邮件被正确拦截。
actual: 垃圾邮件(spam), predicted: 垃圾邮件(spam), TP: 真正例(true positive)
航班变更
有用的出行更新被误报。
actual: 非垃圾邮件(not-spam), predicted: 垃圾邮件(spam), FP: 假正例(false positive)
加密币奖励
可疑奖励垃圾邮件被正确拦截。
actual: 垃圾邮件(spam), predicted: 垃圾邮件(spam), TP: 真正例(true positive)
先算全局正确率看起来是:
这是 58.3%,但它混合了两类问题:
- 全部 12 封邮件有多少是对的?
- 所有被报告为 spam 的告警有多少是真的?
第一个朴素想法:沿用全局分母
如果仍然用全局分母,非告警样本会和告警样本一起入账:
问题: 全部邮件里有多少是对的?
(7 / 12 = 58.3%)
问题: 有多少个“spam 预警”是对的?
(3 / 5 = 0.6)
它为什么会疼
e3 和 e4 都是错例,但影响不同:
e3:真实是非垃圾邮件却被报为 spam (FP),直接降低告警可信度;e4:真实是垃圾邮件却被放过 (FN),更接近“召回率损失”,不是“告警错误”。
核心发明:只看正类预测这一列
精确率的问题是:预测为正类(spam)里,有多少是正确的。
所以这个固定样本得到:
互动演示:逐个处理告警
这个节点只处理预测为 spam 的五条邮件,顺序固定:
e1, e3, e5, e9, e10
预测 spam 告警精确率
e1 → TP:立即领取奖品。真实 垃圾邮件(spam),预测 垃圾邮件(spam),格子:TP(真正例(true positive))。运行中精确率:1/1 = 1.0。
立即领取奖品
1/5
1/1
1.0
百分比: 100.0%
3/5 = 0.6
| 步骤 | 邮件 | 真实 | 预测 | 格子 | 可信告警 | 全部告警 | 精确率 |
|---|---|---|---|---|---|---|---|
| 1 | e1 | 垃圾邮件(spam) | 垃圾邮件(spam) | tp (TP) | 1 | 1 | 1/1 = 1.0 |
| 2 | e3 | 非垃圾邮件(not-spam) | 垃圾邮件(spam) | fp (FP) | 1 | 2 | 1/2 = 0.5 |
| 3 | e5 | 垃圾邮件(spam) | 垃圾邮件(spam) | tp (TP) | 2 | 3 | 2/3 = 0.667 |
| 4 | e9 | 非垃圾邮件(not-spam) | 垃圾邮件(spam) | fp (FP) | 2 | 4 | 2/4 = 0.5 |
| 5 | e10 | 垃圾邮件(spam) | 垃圾邮件(spam) | tp (TP) | 3 | 5 | 3/5 = 0.6 |
无 JS 时,页面下方账本仍然可直接读取:
| 步骤 | 邮件 | 主题 | 真实 | 预测 | 格子 | 可信告警 | 全部告警 | 当前值 |
|---|---|---|---|---|---|---|---|---|
| 1 | e1 | 立即领取奖品 | spam | spam | TP | 1 | 1 | 1/1 = 1 |
| 2 | e3 | 收据已附上 | not-spam | spam | FP | 1 | 2 | 1/2 = 0.5 |
| 3 | e5 | 限时优惠 | spam | spam | TP | 2 | 3 | 2/3 = 0.667 |
| 4 | e9 | 航班变更 | not-spam | spam | FP | 2 | 4 | 2/4 = 0.5 |
| 5 | e10 | 加密币奖励 | spam | spam | TP | 3 | 5 | 3/5 = 0.6 |
正确性直觉
对每个被处理的告警而言,结果只可能是 TP 或 FP,所以 TP + FP 就是“所有告警”的计数。
不进入精确率分母的样本是:
TN + FN在外:e2,e4,e6,e7,e8,e11,e12- 漏报的真实垃圾邮件在外:
e4,e8,e12
到末尾:
TP = 3FP = 2precision = 3 / 5 = 0.6
实现思路
interface Counts {
tp: number;
fp: number;
}
function precisionFromCounts(counts: Counts) {
const denominator = counts.tp + counts.fp;
if (denominator === 0) {
return { numerator: counts.tp, denominator, value: null };
}
return { numerator: counts.tp, denominator, value: counts.tp / denominator };
}
复杂度
如果你已经有 tp/fp 计数:
O(1)即可给出精确率;- 先扫描一次再统计时是
O(n)时间、额外O(1)空间。
常见误区
- 精确率不是准确率,准确率看全部 12 封。
- 精确率不是召回率,召回率看实际为 spam 的覆盖率。
- 精确率高不代表漏报少:
e4、e8、e12在分母外,仍会被模型漏掉。
| 示例 | 为何精确率仍是 3/5 |
|---|---|
| e3 | 误报(FP)— 会降低信心。 |
| e4 | 漏报(FN)— 不在分母内。 |
| e8 | 漏报(FN)— 同样在分母之外。 |
| e12 | 漏报(FN)— 仍在分母之外。 |
e4, e8, e12
不可用
零分母约定
若模型完全没报警(tp = 0, fp = 0):
- 分母
tp + fp = 0 - 内部返回
null - 文案渲染为
不可用(英文显示为not available)
预测为 spam 且真实为 spam(对告警)。
立即领取奖品
明显的中奖诱饵,被过滤器拦下。
actual: 垃圾邮件(spam), predicted: 垃圾邮件(spam), TP: 真正例(true positive)
限时优惠
促销垃圾邮件被正确拦截。
actual: 垃圾邮件(spam), predicted: 垃圾邮件(spam), TP: 真正例(true positive)
加密币奖励
可疑奖励垃圾邮件被正确拦截。
actual: 垃圾邮件(spam), predicted: 垃圾邮件(spam), TP: 真正例(true positive)
预测为 spam 但真实为 not-spam(误报)。
收据已附上
真实收据被错误标成垃圾邮件。
actual: 非垃圾邮件(not-spam), predicted: 垃圾邮件(spam), FP: 假正例(false positive)
航班变更
有用的出行更新被误报。
actual: 非垃圾邮件(not-spam), predicted: 垃圾邮件(spam), FP: 假正例(false positive)
TN + FN 在分母之外 (7)
e2, e4, e6, e7, e8, e11, e12
图谱连接
已实现
已实现
练习
- 为什么准确率和精确率分母不同?
- 按
e1 -> e3计算前两步精确率。 precision = null的场景里不应该显示哪个值?- 哪类案例会进入精确率分母,哪类不会?
图谱连接 : 精确率