一句话定义:在机器学习分类任务中,Precision(常译为精确率或查准率)等于 TP ÷ (TP + FP),回答“所有被模型判为正类的样本中,真正是正类的比例有多高”。它关注假阳性(False Positive,误报),并不等同于 Accuracy(所有预测中有多少正确)、Recall(实际正类中找回多少)、测量学中的精密度,也不等同于 FP32/FP16 等数值精度。Precision 必须和正类定义、数据集、阈值、平均方式及样本时间窗一起报告。
### Markdown 标题。现已删除。本文以机器学习分类 Precision 为主意图,只在末尾明确区分另外两种同名语义,不再用跨领域故事替代公式与可复核评估。Precision 公式怎么理解?
Google Machine Learning Crash Course与TensorFlow 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,都无法判断实用性。
多分类和多标签任务为什么会出现 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_score 的 zero_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,也支持显式 thresholds、top_k 与 class_id;如果模型输出 logits,阈值语义需要与损失函数设置一致。
离线 Precision 高,上线后为什么仍会失效?
- 正类率变化:Precision 会受实际正类占比影响。离线数据正类被过采样时,直接搬到线上可能明显下降。
- 标签延迟:欺诈、流失、投诉等标签可能数天或数月后才完整;过早统计会把尚未确认的样本当负类。
- 选择偏差:只复核模型判为正的样本,无法可靠知道 FN;需要抽样检查预测为负的人群。
- 阈值或版本漂移:模型、特征、校准、业务规则和后处理任一变化都可能改变混淆矩阵。
- 群体差异:总体 Precision 可能掩盖地区、设备、语言、客户群或少数类别的严重误报。
- 反馈回路:模型决策改变了用户行为或可观察标签,历史评估关系可能不再成立。
上线看板至少同时记录模型版本、阈值、预测正类数、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 曲线和类别工作点不是同一概念;后续库接口变化将按版本更新。
