准确率、查准率、召回率别再混淆:从混淆矩阵到阈值取舍

发布时间:2026/9/30 1:22:05
准确率、查准率、召回率别再混淆:从混淆矩阵到阈值取舍 先说一次我自己踩过的坑。有回做信贷风控模型评审业务方兴冲冲地跟我说新模型的准确率(Accuracy)到99%了可以上线。我随手看了下样本分布——坏客户只占0.7%。也就是说模型就算把所有客户都判成好客户准确率也能到99.3%。这个“99%的准确率”不但说明不了模型很强反而暴露了一个更麻烦的问题模型很可能压根没在区分风险只是复读机一样输出“无风险”。类似的误解在项目里太多了。“准确率”三个字听着顺耳但真正到了要选指标、调阈值、跟业务解释模型价值的时候准确率(Accuracy)、查准率(Precision)、查全率(Recall)这三兄弟经常被人揉成一团。网上一搜全是公式可真到自己拿数据动手还是会发现“好像会算但不知道怎么用”。这篇文章我打算换个角度不从公式出发而是先聊清楚每个指标到底在回答什么问题再一步步把混淆矩阵、类别不平衡、阈值取舍讲透最后用一个搜索热度很高但很少有人讲清楚的话题收尾accuracy和recall在什么条件下会数值相同。1. 三个指标背后其实是三个完全不同的提问方式1.1 Accuracy 只在乎“整体你答对了多少分”Accuracy是最没门槛的指标预测对了多少样本除以总样本数。它是一个“总分思维”的指标把所有样本的重要性一视同仁目标只有一个——你数一数我总共猜对了几次。这个指标本身没有错错的是在错误的场景里用它。考试里对题错题每道都一样分但真实业务中“好客户被拒”和“坏客户被放进来”的代价差着几个数量级。一旦类别比例变得不平衡Accuracy会迅速失真这个坑我放到第3节详细说。1.2 Precision 追问的是“你说它是正类的时候到底有几成是真的”Precision查准率也有人叫精确率的公式是 TP/(TPFP)。它只看模型预测为正类的那些样本然后问这里面真正属于正类的比例有多少打个比方你是流水线上的质检员你的工作是说“这个零件不合格”。Precision衡量的是你每次喊“不合格”的时候是不是真的不合格。如果你老是误伤合格件车间主任对你的信任度会直线下降——因为每次你喊停线整条产线都要白忙活一阵。所以Precision怕的是误报(FP)误报越多这个数越低。学术文献里它也叫PPVPositive Predictive Value医学领域常译作“阳性预测值”。叫法不同内核是同一个。1.3 Recall 追问的是“真正该抓的人你漏了几个”Recall查全率更常见的叫法是召回率的公式是 TP/(TPFN)。它只看实际为正类的样本然后问这些真正该抓的被我找回了多少还是举个例子安检口查违禁品100个真带了违禁品的人你拦下80个Recall就是80%。漏掉的那20个是FN可能造成真实的危险。Recall怕的是漏报(FN)漏得越多这个数越低。在医学里Recall就是灵敏度(Sensitivity)专门衡量“有病的人里筛出了多少”。我见过不少同学把Recall理解成“模型找回了多少正类”其实这个理解已经到位了关键是别把它和Precision在分母上搞混。1.4 一个绕不开的纠偏其他领域对 precision 和 accuracy 的定义并不一样这里顺便说句题外话。很多做硬件、传感器、精密加工的工程师朋友听到“precision”这个词第一反应是测量学里的“精密度”意思是重复测量的结果有多一致而“accuracy”在测量学里指测量值和真实值的接近程度。这套“精密度 vs 准确度”的二分法在测量领域非常成熟。但它和机器学习里的查准率、准确率根本不是一个体系。机器学习的Precision强调的是“预测为正类之后的可信度”是一个分类结果的条件概率跟“重复测量的离散程度”没有半点关系。如果你拿测量学那套去套模型指标会把“重复性好”误当成“预测准”这个坑我在跨专业合作评审里见过不止一次。1.5 一张表收住三个问题的答案指标它在问的问题最怕的错误一句话场景Accuracy整体上我猜对了几次把两类错误当成同代价类平衡、错误代价差不多时用Precision我说“是”的时候可信吗FP 误报垃圾邮件过滤、质检喊停Recall该抓的我漏了吗FN 漏报疾病筛查、风控要拦坏人2. 混淆矩阵先把“对”和“错”拆成四种情况2.1 为什么四个格子比两个数字更原始只看“对/错”两个数信息会丢。把预测类别和真实标签两两组合就得到四个格子TPTrue Positive预测为正类实际也是正类FPFalse Positive预测为正类实际是负类也就是误报FNFalse Negative预测为负类实际是正类也就是漏报TNTrue Negative预测为负类实际也是负类天气预报是最直观的例子预报“会下雨”并且真下了是TP预报“会下雨”结果大晴天是FP预报“不下雨”结果被淋成落汤鸡是FN预报“不下雨”并且真的没下是TN。所有分类指标本质上都是这四个格子的加减乘除。所以遇到任何指标看不懂的时候先把它还原成四格表基本就通了。2.2 三种指标在四格表上的表达式Accuracy (TP TN) / (TP FP FN TN)Precision TP / (TP FP)Recall TP / (TP FN)不需要死记。只要记得每个指标“在问什么问题”带着问题看分母就行Accuracy问总样本里对多少Precision问预测为正类的样本里对多少Recall问真实正类里找回多少。分母一变指标的含义就完全不同。顺带补充两个常用的亲戚Specificity特异度 TN / (TN FP)衡量“负类里你有多少没被误报”。FPR假正率 FP / (TN FP) 1 - SpecificityROC曲线横轴就是它。2.3 一个完整的手算例子用一个信用卡欺诈检测的例子。测试集共200笔交易真实情况是160笔正常、40笔欺诈。模型输出如下40笔欺诈里正确识别30笔漏了10笔160笔正常里正确放过150笔但有10笔被误报成欺诈。于是 TP30FP10FN10TN150。套公式Accuracy (30 150) / 200 0.90Precision 30 / (30 10) 0.75Recall 30 / (30 10) 0.75可以看到Accuracy有90%但Precision和Recall只有75%。只看Accuracy你会觉得模型还不错但知道Precision是75%之后你就要意识到模型报10次欺诈里有2.5次是冤枉好人Recall是75%则意味着真实欺诈里还有四分之一漏掉了。同一个模型三个数讲的是完全不同的故事。有意思的是这个例子里Precision恰好等于Recall因为FP和FN都等于10。Precision TP/(TPFP)Recall TP/(TPFN)当FPFN时两者天然相等——这是另一个容易让人困惑的巧合后面第5节讲accuracyrecall时会用到同款思路。2.4 动手算一遍scikit-learn 三五行代码实际项目里没人手算这些Python里用scikit-learn几行就出结果import numpy as np from sklearn.metrics import (accuracy_score, precision_score, recall_score, confusion_matrix) # 真实标签前160个是负类后40个是正类 y_true np.array([0] * 160 [1] * 40) # 预测负类里150个判对、10个误报正类里30个判对、10个漏报 y_pred np.array([0] * 150 [1] * 10 [0] * 10 [1] * 30) tn, fp, fn, tp confusion_matrix(y_true, y_pred).ravel() print(混淆矩阵TN%d FP%d FN%d TP%d % (tn, fp, fn, tp)) print(Accuracy :, accuracy_score(y_true, y_pred)) print(Precision:, precision_score(y_true, y_pred)) print(Recall :, recall_score(y_true, y_pred))我建议在汇报任何单值指标之前一定先看一眼混淆矩阵。有一次我评审别的团队的模型对方报了0.94的AUC听起来很漂亮结果混淆矩阵一打出来发现负类被误报了几百条——而业务的黄金法则是“误报比漏报更致命”这个模型实际上是灾难。先看矩阵很多问题能直接暴露根本不用等上线。3. 类别不平衡时Accuracy 是最会骗人的指标3.1 一个“什么都不做的模型”如何拿到99%准确率拿医疗筛查举例某疾病在体检人群里的发病率是1%。你训练一个模型发现它的测试准确率是99%。听起来很厉害但如果我们做一个“复读机模型”——不管什么样本都判“健康”——它的准确率也会是99%。因为10000个人里本来就只有100个病人你全判健康判对了9900个。也就是说Accuracy在这里根本没有在评价“模型有没有识别疾病”它只是在复述“负类样本占多少比例”。在类别极度不平衡的场景下这个指标衡量的更多是数据分布的运气而不是模型的能力。这不是模型或指标计算有bug是Accuracy的提问方式在这种场景下天然失效。3.2 为什么不平衡场景要盯 Precision 和 Recall关键原因是代价不对称。在欺诈检测里漏掉一笔欺诈FN可能损失几十万误拦一个正常客户FP顶多让客服多解释几句在医疗里漏掉一个病人FN可能延误治疗误报FP通常只是让人多做一次复查在垃圾邮件里误删一封正常邮件FP引发的投诉往往比多收一封垃圾邮件FN严重得多。而Accuracy默认把FN和FP当成同代价它的前提假设——“所有错误一样贵”——在绝大多数业务里是不成立的。当错误代价不对称时我们真正需要回答的问题就变成了模型报出来的正类里靠谱吗Precision模型把该找的正类找全了吗Recall3.3 汇报不平衡模型时推荐的做法第一不管类别比例如何先看混淆矩阵确认每类错误的具体数量很多“好看”的指标经不起这一步。第二主报Precision、Recall和F1少报裸的Accuracy实在要报Accuracy最好在旁边标注“正类占比X%哑模型Accuracy是Y%”让读者自己判断水分。第三如果要画曲线优先看Precision-Recall曲线而不是ROC曲线。理由很简单ROC曲线用到了大量TN的信息正类很稀有时FN和FP都会被海量的TN稀释曲线容易显得乐观而PR曲线只看正类相关的行为对类别不平衡敏感得多能直接反映模型找正类的真实水平。我见过一个只对2%样本感兴趣的多分类项目ROC-AUC做到0.97PR曲线却惨不忍睹——后者才是业务真正要看的数。4. Precision 与 Recall 的跷跷板阈值、业务定价与 F-score4.1 模型输出的是分数阈值才是判决大多数分类模型输出的不是一个硬性的0/1而是一个分数概率、距离、logit等预测成哪一类全看你把阈值切在哪里。阈值高只有高置信度的样本才被判为正类预测为正类的数量变少能进正类的多半是真货Precision上去但真货里分数不够高的那部分也被牺牲掉了Recall下降。阈值低更多样本被判为正类Recall上升但误报也跟着涌进来Precision下降。这不是模型“不稳定”而是它本来就是这个结构。你可以把每个样本看成在按分数排队threshold就是安检线的位置线抬高了过去的人少但更可靠线降低了过去的人多但杂质也多。Precision和Recall从两个方向争夺同一个位置天然互斥不存在“两全其美”的解只存在“在业务成本约束下哪个解更好”。4.2 不同业务该把安检线放在哪场景优先指标理由癌症初筛Recall优先漏诊代价大于误诊宁可多叫回来复查垃圾邮件过滤Precision优先误删正常邮件对用户体验的伤害非常大反欺诈看业务成本审核人力有限时倾向Precision损失严重时可牺牲Precision换Recall商品推荐Precision为主推了不买损害体验漏推的损失相对不大不同场景对FN和FP的定价不同阈值就该跟着定价走而不是永远定在0.5。这也是为什么我强烈建议在做模型落地之前把“FN和FP的单位成本估算”写进项目文档哪怕只是粗略的估计——它能让阈值选择从玄学变成计算题。4.3 不想同时盯两个数引入 F-score 做折中F1 2PR / (P R)是Precision和Recall的调和平均数。调和平均对“一个极高一个极低”的惩罚很大两个数都高F1才高。比如P0.9、R0.1算术平均是0.5但F1只有0.18。这个惩罚是合理的说明你并没有真正同时做到准和全。嫌F1不够灵活还有F-betabeta大于1时更看重Recall小于1时更看重Precision。医学检索场景常用F2因为漏报更不可接受。不要纠结用哪个先想清楚你这边FN和FP哪个更贵再选betaF-score只是把业务偏好编码成一个数字而已。5. accuracy 和 recall 值相同把两个数相等的条件推出来5.1 先打破一个直觉误区数据平衡不等于两者相等很多人有个朴素直觉“数据平衡的时候Accuracy应该等于Recall吧”其实不成立。举个反例正类100个、负类100个TP40、FN60、FP30、TN70。算一下Accuracy (40 70) / 200 0.55Recall 40 / (40 60) 0.40差得还挺远。可见光靠“类别平衡”远远不够。那到底什么时候两个数会相等5.2 代数推导充要条件是 TN × FN TP × FP令 Accuracy Recall(TP TN) / (TP FP FN TN) TP / (TP FN)交叉相乘得到(TP TN)(TP FN) TP(TP FP FN TN)左边展开是 TP² TP·FN TN·TP TN·FN右边是 TP² TP·FP TP·FN TP·TN。两边同时消掉 TP²、TP·FN 和 TP·TN最后剩下TN × FN TP × FP也就是说准确率等于召回率的充要条件是漏报数乘以真负类数等于误报数乘以真正类数。注意这不是什么巧合而是一个严格的代数结论。所以能达成相等的方式很多比如FP和FN都为0模型完全正确两个数都是1比如混淆矩阵完全对称TPTN且FPFN也可能矩阵看起来很不平衡但乘积恰好相等。5.3 三个数值例子帮助建立体感例子1完美模型 TP80、FP0、FN0、TN120。Accuracy1Recall1满足00的边界条件。例子2对称误差 TP30、FP10、FN10、TN30总样本80。Accuracy(3030)/800.75Recall30/400.75。这是典型的矩阵对称TN·FN300TP·FP300两边相等。例子3看起来很不平衡但依然相等 TP20、FP30、FN60、TN10总样本120。Accuracy(2010)/1200.25Recall20/800.25。虽然两个指标都很低但它们确实相等因为TP·FP600TN·FN600。这个例子提醒我们“数值相等”并不代表“指标表现好”它只是两个比分巧合地一致。5.4 平衡数据下还能简化成一句更直观的话当正负类样本数量相同时NpNn设负类的误报率 a FP/(TNFP)正类的漏报率 b FN/(TPFN)可以推出Accuracy 1 - (a b) / 2Recall 1 - b两者相等当且仅当 a b。翻译成人话在平衡数据集上准确率等于召回率等价于“负类的误报率等于正类的漏报率”。这比纯代数条件好记得多也解释了为什么网上那么多人困惑——他们只把类别数平衡了却忽略了错误率也得对称两个数当然不会相等。5.5 实践中见到 accrecall该怎么反应如果模型报告里出现Accuracy和Recall完全相等我的第一个动作永远是打混淆矩阵而不是开心地觉得“模型很均衡”。因为可能的原因大概有四类数据完全平衡且错误率对称这是正常情况模型退化成了某种平凡预测比如不管什么样本都输出同一个类别需要警惕样本量太小两个数四舍五入后恰好撞车纯属巧合最后才是真正的偶然相等没什么可解读的。不查矩阵你永远分不清是哪种。6. 多分类评价与汇报习惯macro、micro、weighted 和“别只报一个数”6.1 多分类每个类单独算再想办法合并二分类的四格表到了多分类比如新闻分类5个类就不能直接用了。主流做法是把每个类单独拎出来做“一对多”当前类是正类其余所有类是负类于是又变回一个二分类四格表。K个类就能得到K套Precision和Recall。问题是汇报的时候总不能报K个数字于是有了三种合并方式Macro宏平均K个类的Precision直接求平均再算Recall平均。每个类地位相等不受样本量影响但小类的随机波动会被同等放大。Micro微平均把所有类的TP、FP、FN汇总成一张大四格表再算Precision和Recall。它天然偏向大类别样本量大的类贡献更大。Weighted加权平均每个类按样本占比加权是macro和micro的折中也是sklearn的classification_report默认输出里最常用的一档。6.2 该选 macro 还是 micro取决于你关心谁如果业务关心每个类都要做对比如安全生产隐患的细粒度分类用macro因为它不让大类掩盖小类的糟糕表现如果业务关心的是总体的正确率被大类主导也没关系用micro会更贴近“整体用户受影响”的直觉。这两者的差异经常被忽略但在类别严重不平衡的多分类里macro比micro低一大截是很常见的事恰好说明模型在小类上瘸腿。我做过一个工单自动分类项目大类占了70%的样本micro F1到0.83看起来一切正常macro F1只有0.31——最后排查发现三个长尾小类几乎全被模型判成了大类这种问题不拆开看永远发现不了。6.3 汇报真实项目时我养成的几个习惯只会生跑一张classification_report是不够的。我给自己定了几条规矩先看混淆矩阵再看指标。矩阵能暴露“哪两类互相混淆”“模型是不是偏向大类别”这类单值看不到的问题。至少写清楚“阈值是多少、正类占比多少、哑模型表现如何”。这三个信息决定别人能不能正确解读你报的Accuracy。两个模型要对比时除了看P/R/F1还要对齐使用场景。一个Precision 0.95、Recall 0.3的模型和一个Precision 0.7、Recall 0.8的模型本身没有绝对优劣只有适不适合当前业务定价。落到实操sklearn的classification_report能一口气输出每个类以及macro、weighted的指标from sklearn.metrics import classification_report # y_true、y_pred 都是多分类标签 print(classification_report(y_true, y_pred, digits3))最后说点个人体会。这三个指标我用了很多年真正让我觉得“熟练”的时刻不是把公式倒背如流而是养成了一种条件反射拿到一个分类问题先问自己——这件事里FN和FP分别值多少钱再问——我看的这个数会不会只是在重复数据分布本身这两个问题想清楚Accuracy、Precision、Recall基本就不会用错该换F1还是该换PR曲线答案也自然浮现了。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询