Precision
精确率是正确的正类预测所占比例:TP / (TP + FP)。了解正类流行率如何影响精确率、检测器如何计算精确率,以及如何提高精确率。
精确率是模型所有正向预测中正确预测所占的比例。它回答的问题是“模型说是时,判断正确的频率有多高?”,计算方法为真正例除以所有正向预测:精确率 = TP / (TP + FP),其中假正例(FP)是模型错误标记的负例。精确率的范围为 0 到 1,因此精确率为 0.95 意味着每 20 次警报中有 1 次误报。阳性预测值(PPV)是医学领域的同义术语,假发现率等于 1 减去精确率。误报代价高时,精确率尤为重要,例如会隐藏真实邮件的垃圾邮件过滤器、会报废合格零件的检测系统,或会因阴影而叫来警卫的安防摄像头。
精确率的计算方法#
精确率取用混淆矩阵中的两个单元格:真正例和假正例,它们合起来构成所有正向预测。漏掉的正例不会进入公式,因此,只标记最确定的一个案例的模型,即使几乎什么都没发现,精确率仍可达到 1.0。因此,报告精确率时通常也会报告召回率,其计算公式为 TP / (TP + FN),正好会惩罚这些漏检;F1 分数则将两者合并为一个数值。如果模型完全没有正向预测,精确率就是 0 / 0,无法定义;scikit-learn 等库会发出警告并将其报告为 0。
类别数超过两个时,会逐类计算精确率,将当前类别视为正类、其他所有类别视为负类,然后再取平均。宏平均精确率对每个类别赋予相同权重;在单标签多分类任务中,微平均精确率等于准确率。
精确率取决于患病率#
召回率和特异度分别描述模型如何处理正例和负例,因此当正例变得更少时,两者保持不变。精确率综合了这两组数据,会随患病率下降而降低,因为相同的假正例率作用于更多负例时,每次真正检出都会伴随更多误报。下面的 scikit-learn 脚本会在两种患病率下评估同一个筛查模型:
import numpy as np
from sklearn.metrics import accuracy_score, precision_score, recall_score
# One screening model at two prevalences: it finds 90% of positives and flags 1% of negatives
for positives in (1000, 100):
negatives = 10_000 - positives
tp, fp = int(0.9 * positives), int(0.01 * negatives)
counts = [tp, positives - tp, fp, negatives - fp] # TP, FN, FP, TN
# Rebuild labels and predictions for 10,000 cases from the confusion-matrix counts
y_true = np.repeat([1, 1, 0, 0], counts)
y_pred = np.repeat([1, 0, 1, 0], counts)
accuracy = accuracy_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
precision = precision_score(y_true, y_pred)
print(f"{positives} positives: accuracy {accuracy:.3f}, recall {recall:.2f}, precision {precision:.2f}")在 10,000 个案例中有 1,000 个正例时,模型的精确率为 0.91。正例减少到 100 个时,召回率仍为 0.90,准确率甚至上升至 0.989,但 90 个真正例旁边出现了 99 个误报,精确率则降至 0.48。因此,在平衡测试集上测得的精确率会高估模型在正例更少的部署环境中的精确率,例如罕见疾病筛查。
目标检测中的精确率#
在目标检测中,所有高于置信度阈值的预测框都是正向预测。预测结果按置信度从高到低依次匹配;只有当一个框与同类别的标注目标之间的交并比(IoU)达到或超过阈值,且该目标尚未被置信度更高的框匹配时,该框才算真正例。背景上的框、类别错误的框、定位不准的框,以及落在已匹配目标上的重复框,都算作假正例。
提高置信度阈值会移除低分框,而低分框更容易出错,因此精确率通常会上升、召回率则会下降。绘制各个阈值下的精确率和召回率,就能得到精确率-召回率曲线;曲线下面积就是平均精度(AP)。平均精度均值(mAP)会对各类别的 AP 取平均;对于 mAP50-95,还会对 10 个 IoU 阈值取平均。YOLO26验证会将每个类别在各置信度阈值下的精确率保存为 BoxP_curve.png,并在平均 F1 分数达到峰值的置信度下报告精确率(P),同时报告召回率和 mAP。
提高精确率#
- 提高置信度阈值:最快捷的解决方法,但代价是召回率降低。
- 加入难负样本:将容易混淆、会触发误报的物体和空场景加入训练数据,让模型学会哪些情况不该标记。以这种方式挑选最容易混淆的负样本,称为难负样本挖掘。
- 修复缺失标签: 标注人员漏标的对象即使被正确检测到,也会被计为假阳性,因此不完整的真实标签会让精确率看起来比实际更低。
- 区分容易混淆的类别: 混淆矩阵会显示模型容易混淆哪些类别;为这些类别对补充更多示例或明确类别定义,就能减少类别错误导致的假阳性。
精确率与相关术语#
- 召回率: 模型找出的实际正例占所有实际正例的比例,即 TP / (TP + FN)。它统计漏检,而精确率统计误报。
- 特异度: 被正确判定为负例的实际负例所占比例,即 TN / (TN + FP)。当正例很少时,即使特异度达到 0.99,精确率仍可能低于 0.5,筛查脚本就展示了这一点。
- 准确率: 所有预测中正确预测所占的比例;在数据不平衡时,它主要受多数类支配。
- 数值精度: 存储每个数值所用的位数,例如 32 位或16 位浮点数;这是同一个词的另一种无关含义。
- 测量精密度: 多次重复测量结果彼此接近的程度;准确度则描述测量结果与真实值的接近程度。始终读数偏重 2 kg 的秤精密度高,但准确度低。










