AI概念与词典

Precision 精确率是什么?公式、Recall 区别与阈值选择指南

分类指标Precision=TP/(TP+FP),回答“被模型判为正的样本里有多少是真的”。本文用混淆矩阵讲清Precision、Recall、Accuracy、F1、阈值、多分类平均和零分母,并区分测量精密度与数值精度。

通过 TP、FP、FN、TN 混淆矩阵解释 Precision 等于 TP 除以 TP 加 FP,并对比 Recall 和 Accuracy
本页目录
  1. Precision 公式怎么理解?
  2. Precision、Recall、Accuracy 和 F1 有什么区别?
  3. 分类阈值为什么会改变 Precision?
  4. 多分类和多标签任务为什么会出现 macro、micro、weighted?
  5. TP+FP=0 时 Precision 为什么会是未定义?
  6. 一个可复现的 scikit-learn 计算示例
  7. 离线 Precision 高,上线后为什么仍会失效?
  8. 测量学 precision 与数值 precision 为什么不是分类 Precision?
  9. 常见问题
  10. Precision 越高,模型就一定越好吗?
  11. Precision 和准确率是一个词吗?
  12. 类别很不平衡时只看 Precision 可以吗?
  13. 模型没有预测正类时 Precision 是多少?

一句话定义:在机器学习分类任务中,Precision(常译为精确率或查准率)等于 TP ÷ (TP + FP),回答“所有被模型判为正类的样本中,真正是正类的比例有多高”。它关注假阳性(False Positive,误报),并不等同于 Accuracy(所有预测中有多少正确)、Recall(实际正类中找回多少)、测量学中的精密度,也不等同于 FP32/FP16 等数值精度。Precision 必须和正类定义、数据集、阈值、平均方式及样本时间窗一起报告。

重要更正(复核日期:2026 年 7 月 16 日):本页原文把分类指标、测量精密度、浮点数值精度、卫星定位、机器人控制、医疗和农业写成一个“压缩不确定性”的统一概念,并加入厘米/毫米/千赫兹等无来源数字、2026 路线预测、虚构项目和裸露的 ### Markdown 标题。现已删除。本文以机器学习分类 Precision 为主意图,只在末尾明确区分另外两种同名语义,不再用跨领域故事替代公式与可复核评估。
通过预测为正和预测为负、实际为正和实际为负组成的混淆矩阵,解释 Precision 等于 TP 除以 TP 加 FP
Precision 的分母只看“模型判为正”的样本:其中 TP 是正确命中,FP 是误报。TN 和 FN 不直接进入公式,但会影响其他指标与业务风险。

Precision 公式怎么理解?

Google Machine Learning Crash CourseTensorFlow Precision 指标文档都将 Precision 定义为真阳性除以真阳性与假阳性之和:

Precision = TP / (TP + FP)

  • TP(True Positive):实际为正,模型也判为正。
  • FP(False Positive):实际为负,模型误判为正。
  • FN(False Negative):实际为正,模型漏判为负。
  • TN(True Negative):实际为负,模型也判为负。

例如,风控模型把 100 笔交易标为“需要人工复核”,其中 80 笔经复核确有风险、20 笔是正常交易,则 TP=80、FP=20,Precision=80/(80+20)=0.80,即 80%。这不说明模型找到了全部风险交易,因为还不知道实际风险交易中有多少被漏掉;后者要看 Recall。

实际/预测 预测为正 预测为负
实际为正 TP=80 FN=40
实际为负 FP=20 TN=860

在这个完整例子中,Precision=80%,Recall=80/(80+40)=66.7%,Accuracy=(80+860)/1000=94%。94% Accuracy 看起来很高,但模型仍漏掉三分之一实际正类。这正是类别不平衡任务不能只报 Accuracy 的原因。若想先理解分类任务的基本结构,可阅读站内的分类概念说明

Precision、Recall、Accuracy 和 F1 有什么区别?

指标 公式 回答的问题 主要受哪类错误影响
Precision TP/(TP+FP) 判为正的结果有多少是真的? FP 误报
Recall TP/(TP+FN) 实际正类有多少被找回? FN 漏报
Accuracy (TP+TN)/全部样本 所有预测中有多少正确? 四格共同决定,易受类别占比影响
F1 2PR/(P+R) Precision 与 Recall 的调和平均是多少? 任一项很低都会拉低 F1

指标选择由错误成本决定。误把正常邮件丢进垃圾箱、误拦正常支付、把无关文档推给审核员的代价高时,通常需要较高 Precision;漏掉疾病、欺诈、安全事件或召回候选的代价高时,通常更重视 Recall。F1 在两者都重要时提供一个汇总值,但它仍不会告诉你 FP 与 FN 的真实业务成本,也不会反映概率是否校准。站内的F1 Score 概念页可继续了解调和平均,但生产验收仍应保留原始混淆矩阵。

分类阈值为什么会改变 Precision?

分类器通常先输出分数或概率,再用阈值转成正/负标签。Google 阈值与混淆矩阵说明强调概率分数不是真实标签:提高阈值通常会减少被判为正的样本,FP 往往下降、Precision 往往上升,但 FN 可能增加、Recall 下降。Precision 不保证随阈值严格单调上升,因为样本排序和有限数据会造成局部波动。

阈值不能在测试集上反复调到最好再把同一结果当作无偏评估。较稳妥的流程是:训练集拟合模型,验证集选择阈值,独立测试集做最终报告;上线后用带延迟的真实标签复核。高风险场景还应把人工审核容量写成约束,例如“每天最多复核 500 条,Precision 至少 90%,在此约束下最大化 Recall”,而不是抽象追求某一个指标最大。

scikit-learn 的决策阈值调优文档明确区分“模型输出概率/分数”和“把分数变成类别的业务动作”。TunedThresholdClassifierCV 默认通过分层交叉验证选择阈值;若使用 cv="prefit",不能再拿训练模型的同一批数据调阈值,否则会过拟合。阈值调优只改变最终类别标签和工作点,不会改变同一模型的 predict_proba、ROC 曲线或 PR 曲线本身。

阶段 允许做什么 输出证据 禁止的捷径
训练 拟合模型参数与预处理 训练数据版本、代码、模型制品 在训练集上选择并宣称最终 Precision
验证/交叉验证 按 FP/FN 成本、容量或约束选择阈值 候选阈值、Precision/Recall、预测量与选择规则 反复查看测试结果再回调阈值
独立测试 冻结阈值后一次性估计工作点 TP/FP/FN/TN、支持度、区间、分组结果 只报告最漂亮的切分或子群
上线 监控正类率、标签成熟度、审核量和漂移 模型/阈值版本、回滚线、重调触发条件 用平均置信度代替真实 Precision

概率校准和阈值选择也不是同一件事。校准关注“0.8 分数是否对应约 80% 发生率”,阈值选择关注“在当前成本和容量下从哪里切”。模型可以排序良好但概率未校准,也可以概率校准后仍因业务成本变化而需要新阈值。任何重调都应使用新验证窗口并保留独立测试或时间外样本。

业务情况 优先约束 阈值方向 必须同时监控
误报会造成封号、拒付或重大人工成本 Precision 下限 通常提高,但以验证曲线为准 Recall、误报人数、分组差异、申诉率
漏报会造成安全、疾病或欺诈损失 Recall 下限 通常降低 Precision、审核量、告警疲劳、漏报成本
正类极少且需比较模型 PR 曲线/平均精确率与工作点 比较完整阈值范围 基准正类率、置信区间、数据漂移
下游只能处理固定 Top-K Precision@K / Recall@K 由容量 K 决定 K、去重、排序、每用户/每查询分布

Google ROC/AUC 与 PR 曲线说明指出,在类别不平衡时,Precision-Recall 曲线及其面积可能更适合比较模型。scikit-learn 的官方 Precision-Recall 示例展示了怎样按阈值绘制二分类曲线以及怎样对多标签结果做 micro 平均。PR 曲线展示多个阈值下 Precision 与 Recall 的取舍,而单个 Precision 只是一个工作点。任何“模型 Precision 95%”如果没有阈值、正类率和 Recall,都无法判断实用性。

根据误报成本、漏报成本、人工审核容量和类别不平衡选择 Precision 约束、Recall 约束、阈值与线上监控
阈值是业务决策,不是模型常数。先写 FP/FN 成本与处理容量,再用验证集选择工作点,最后在独立测试和线上标签中复核。

多分类和多标签任务为什么会出现 macro、micro、weighted?

二分类只有一个指定正类;多分类通常把每个类别分别视为“一对其余”计算 Precision,再决定怎样平均。scikit-learn metrics API提供相关函数,precision_score 参数页则定义了 binary、micro、macro、weighted、samples、标签选择和零分母处理。报告多分类结果时必须写明 average,否则“Precision=0.9”仍缺少定义。

平均方式 计算思路 适合观察 风险
binary 只计算指定正类 二分类或关注某一类 正类定义写反会完全改变含义
macro 各类别 Precision 等权平均 是否照顾少数类别 极少样本类别波动会显著影响结果
weighted 按各类别真实样本数加权 反映总体类别分布 大类可能掩盖小类失败
micro 先汇总所有类别 TP/FP 再计算 整体实例/标签级表现 在单标签多分类中可能接近 Accuracy
samples 多标签任务按样本计算后平均 每个样本标签集合的质量 不适用于普通单标签分类

实践中建议同时报告每类支持度(support)、每类 Precision/Recall/F1、macro 和 weighted,并展示混淆矩阵。只给 weighted 平均可能让占比很小但业务关键的类别被大类遮住;只给 macro 又可能让极少样本类别的随机波动左右总分。站内基准测试说明补充了数据版本、重复运行和可复现参数的重要性。

TP+FP=0 时 Precision 为什么会是未定义?

如果模型从不预测正类,则 TP=0、FP=0,公式分母为 0。Google 课程说明此时可能得到 NaN;它既可能出现在没有正预测的保守模型,也可能被错误地解释成“没有误报所以完美”。scikit-learn 混淆矩阵文档给出 TN、FP、FN、TP 的位置定义,而 precision_scorezero_division 参数用于明确无正预测时怎样返回并是否警告。

不要为了让报表好看而静默把未定义改成 1。应保留预测正类数量、真实正类数量、警告和处理策略;在阈值过高、服务故障或输入分布变化时,“没有正预测”本身就是需要报警的行为。

一个可复现的 scikit-learn 计算示例

from sklearn.metrics import confusion_matrix, precision_score, recall_score

y_true = [1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
y_pred = [1, 1, 1, 0, 1, 0, 0, 0, 0, 0]

tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
precision = precision_score(y_true, y_pred, zero_division="warn")
recall = recall_score(y_true, y_pred)

print({"tn": tn, "fp": fp, "fn": fn, "tp": tp})
print({"precision": precision, "recall": recall})

这个例子得到 TP=3、FP=1、FN=1、TN=5,因此 Precision=0.75、Recall=0.75。真正的项目还要固定 scikit-learn 版本、标签编码、pos_label、样本权重、平均方式、数据切分和阈值。TensorFlow 的 tf.keras.metrics.Precision 默认阈值通常为 0.5,也支持显式 thresholdstop_kclass_id;如果模型输出 logits,阈值语义需要与损失函数设置一致。

离线 Precision 高,上线后为什么仍会失效?

  1. 正类率变化:Precision 会受实际正类占比影响。离线数据正类被过采样时,直接搬到线上可能明显下降。
  2. 标签延迟:欺诈、流失、投诉等标签可能数天或数月后才完整;过早统计会把尚未确认的样本当负类。
  3. 选择偏差:只复核模型判为正的样本,无法可靠知道 FN;需要抽样检查预测为负的人群。
  4. 阈值或版本漂移:模型、特征、校准、业务规则和后处理任一变化都可能改变混淆矩阵。
  5. 群体差异:总体 Precision 可能掩盖地区、设备、语言、客户群或少数类别的严重误报。
  6. 反馈回路:模型决策改变了用户行为或可观察标签,历史评估关系可能不再成立。

上线看板至少同时记录模型版本、阈值、预测正类数、TP/FP/FN/TN、Precision、Recall、标签成熟度、基准正类率、分组结果和置信区间。没有真实标签时只能先监控分数分布、输入漂移、审核接受率和告警量,不能把“模型平均置信度”当作 Precision。模型输出与业务决策的区别可参考站内的机器学习推理词典页

测量学 precision 与数值 precision 为什么不是分类 Precision?

在测量学中,precision 通常描述规定条件下独立测量结果之间的一致程度,与重复性、再现性有关;它不等于与真值接近的 accuracy。NIST TN 1297 术语说明明确提醒 precision 不应当作 accuracy 的同义词,并建议用标准差及具体重复条件等量来表达,而不是只说“精度为 2”。这和分类指标 TP/(TP+FP) 没有同一公式。

在计算中,precision 又指数据类型能表示的范围与有效位,例如 FP32、FP16、BF16、FP8 或 INT8。PyTorch AMP 文档说明混合精度会让部分运算使用较低精度类型、另一些运算保持 FP32,并通过 autocast 与梯度缩放等机制处理性能和数值稳定性。降低数值精度可能提高吞吐或减少显存,但不会自动提高分类 Precision,甚至可能因量化误差改变预测。相关硬件背景可看站内的Tensor Core 与混合精度说明CUDA 基础页

语境 Precision 指什么 典型表达 不可混用之处
分类评估 正预测中真实为正的比例 TP/(TP+FP),连同阈值和正类定义 不是测量重复性,也不是浮点位宽
测量学 规定条件下重复结果的一致程度 重复性标准差、再现性条件、不确定度 不等于与参考值接近的 accuracy
数值计算 浮点/整数数据类型的表示能力 FP32、FP16、BF16、FP8、INT8 低位宽快不代表分类查准率更高

常见问题

Precision 越高,模型就一定越好吗?

不一定。模型可以通过只预测极少数最有把握的样本获得很高 Precision,却漏掉大量正类。必须同时查看 Recall、预测量、阈值和业务覆盖。

Precision 和准确率是一个词吗?

中文翻译容易混乱。分类任务中建议把 Precision 写成“精确率/查准率”,把 Accuracy 写成“准确率”,首次出现时保留英文和公式。

类别很不平衡时只看 Precision 可以吗?

不可以。还要看 Recall、PR 曲线、正类基准率、每类结果、预测正类数量和错误成本。正类极少时少量样本就可能让指标剧烈波动。

模型没有预测正类时 Precision 是多少?

数学上分母为零而未定义。库可能返回 0、1、NaN 或警告,取决于配置。报告必须写明处理策略并把“无正预测”作为独立状态。

编辑复核记录:本文于 2026 年 7 月 16 日依据 Google Machine Learning Crash Course、scikit-learn、TensorFlow、NIST 与 PyTorch 官方资料重写。主意图限定为机器学习分类 Precision;卫星、机器人、精准医疗等跨领域叙事和虚构案例已删除。新增训练—验证—独立测试—上线阈值生命周期,明确阈值调优、概率校准、PR/ROC 曲线和类别工作点不是同一概念;后续库接口变化将按版本更新。