3. 评估指标体系入门

在工业异常检测中,模型输出通常是一个连续异常分数,经过阈值判定后得到“正常/异常”的离散标签。要判断这个判定结果好不好,不能只看“对了多少”,而必须把预测结果与真实标签逐样本对照。混淆矩阵正是这一对照关系的结构化表达,也是准确率、精确率、召回率和F1分数的共同计算基础。

一、核心原理:混淆矩阵是评估的起点

二分类异常检测中,真实标签分为正常与异常,预测结果也分为正常与异常,两两组合形成四个象限:

  • TP(True Positive,真正例):真实为异常,模型也判为异常,是成功检出的缺陷。
  • FN(False Negative,假负例):真实为异常,模型却判为正常,即漏检,工业场景中往往代价最高。
  • FP(False Positive,假正例):真实为正常,模型却判为异常,即误报,会造成停线复检与人力浪费。
  • TN(True Negative,真负例):真实为正常,模型也判为正常,是正确放行的良品。

四个计数一旦确定,后续所有指标都可由它们推导。因此,评估流程的第一步不是直接算准确率,而是先固定测试集、固定阈值,统计出TP、FN、FP、TN。

混淆矩阵与四类指标计算关系 混淆矩阵(阈值判定后) 列:真实标签 行:预测结果 真实异常 真实正常 预测异常 预测正常 TP FP FN TN 四类指标定义与计算 准确率 Accuracy (TP + TN) / (TP + FN + FP + TN) 精确率 Precision TP / (TP + FP) → 预测为异常中真正异常占比 召回率 Recall TP / (TP + FN) → 真实异常中被检出的占比 F1 分数 2 × P × R / (P + R) → 精确率与召回率的调和平均 工业异常检测中:漏检 FN 常对应安全/质量风险,误报 FP 常对应停线复检成本; 因此不能只看准确率,需结合 Precision、Recall 与 F1 综合判断阈值是否合理。

二、四个指标的定义与计算方式

基于混淆矩阵,四个常用指标定义如下:

指标 公式 关注点 工业含义
准确率 Accuracy (TP + TN) / 总数 整体判对比例 类别极不平衡时容易虚高
精确率 Precision TP / (TP + FP) 报出的异常有多准 低则误报多,复检成本高
召回率 Recall TP / (TP + FN) 异常有没有被漏掉 低则漏检多,质量风险大
F1 分数 2PR / (P + R) 精确率与召回率平衡 用于综合比较不同阈值

其中,准确率看似直观,但在工业异常检测中往往具有欺骗性。例如1000个样本中只有10个异常,模型全部判为正常,准确率仍高达99%,但召回率为0,完全失去了检测意义。因此,异常检测更应优先关注召回率与精确率的权衡。

三、方法流程:从预测结果到指标计算

  1. 准备带真实标签的测试集,标签为0(正常)或1(异常)。
  2. 模型输出异常分数,选定一个阈值,将分数转为0/1预测标签。
  3. 逐样本比较真实标签与预测标签,累计TP、FN、FP、TN。
  4. 代入公式计算Accuracy、Precision、Recall、F1。
  5. 调整阈值,重复上述过程,观察指标变化,为阈值优化提供依据。

下面给出一个可直接运行的Python计算示例:

import numpy as np

y_true = np.array([0, 0, 1, 1, 0, 1, 0, 0, 1, 0])
y_pred = np.array([0, 1, 1, 0, 0, 1, 0, 1, 1, 0])

TP = np.sum((y_true == 1) & (y_pred == 1))
FN = np.sum((y_true == 1) & (y_pred == 0))
FP = np.sum((y_true == 0) & (y_pred == 1))
TN = np.sum((y_true == 0) & (y_pred == 0))

accuracy  = (TP + TN) / (TP + FN + FP + TN)
precision = TP / (TP + FP)
recall    = TP / (TP + FN)
f1        = 2 * precision * recall / (precision + recall)

print(f"TP={TP}, FN={FN}, FP={FP}, TN={TN}")
print(f"Accuracy={accuracy:.3f}, Precision={precision:.3f}, "
      f"Recall={recall:.3f}, F1={f1:.3f}")

运行结果可得到:TP=3,FN=1,FP=2,TN=4,Accuracy=0.700,Precision=0.600,Recall=0.750,F1=0.667。可以看到,虽然准确率只有70%,但召回率较高,说明漏检较少;精确率偏低,说明误报偏多。若业务更怕漏检,可接受当前阈值;若误报成本过高,则需提高阈值。

四、案例场景:阈值变化如何影响指标

假设某表面缺陷检测模型在100个样本上测试,真实异常20个、正常80个。当阈值取0.5时,模型检出18个异常,其中16个为真异常,2个为误报,漏检4个。此时:

  • TP=16,FN=4,FP=2,TN=78
  • Accuracy=(16+78)/100=0.94
  • Precision=16/(16+2)=0.889
  • Recall=16/(16+4)=0.800
  • F1=2×0.889×0.800/(0.889+0.800)=0.842

若把阈值降低到0.3,模型更激进地判异常,可能检出19个真异常,但误报增加到8个,漏检降为1个。此时Recall升至0.950,Precision降至0.704,F1约为0.809。可见阈值降低提升召回、牺牲精确率;阈值升高则相反。F1分数正是用来在这种权衡中寻找相对平衡点。

实操建议:在工业异常检测中,建议同时输出混淆矩阵与四个指标,并绘制Precision-Recall曲线。若漏检代价远高于误报,可优先保证Recall,再在可接受误报范围内优化Precision。

五、常见误区与复盘

  • 误区一:只看准确率。类别不平衡时准确率会严重失真,必须结合Recall与Precision。
  • 误区二:把精确率和召回率混为一谈。精确率分母是“预测为异常”,召回率分母是“真实为异常”,方向完全不同。
  • 误区三:忽略阈值。同一模型在不同阈值下指标差异巨大,评估必须注明阈值。
  • 误区四:F1越高越好?F1是精确率与召回率的平衡,若业务明确偏向某一侧,应直接看对应指标,而非只盯F1。
复盘要点:评估指标不是孤立数字,而是与业务代价绑定的决策工具。混淆矩阵给出四类错误的分布,准确率、精确率、召回率和F1则从不同角度量化这些错误。只有把指标与漏检成本、误报成本、阈值选择放在一起分析,才能为后续阈值优化提供可靠依据。