准确率、精确率、召回率:公式推导与实战陷阱
评估分类模型,光看一个指标是不够的。
准确率、精确率、召回率——这三个词你肯定听过。
但真正用对的人,说实话不多。
尤其是碰到不平衡数据,一个不留神就被指标骗了。
这一节我们就掰开揉碎,把它们的公式、适用场景、以及坑都讲清楚。
1. 公式与直觉
先统一一下符号。
以二分类为例,样本分正类和负类。
预测结果和真实结果组合成四种情况:
TP(真正例):预测为正,实际为正
FP(假正例):预测为正,实际为负
TN(真负例):预测为负,实际为负
FN(假负例):预测为负,实际为正
基于这四个数,三个指标的定义就很清楚了:
| 指标 | 公式 | 直觉含义 |
|---|---|---|
| 准确率 (Accuracy) | (TP + TN) / (TP + FP + FN + TN) | 所有样本中预测正确的比例 |
| 精确率 (Precision) | TP / (TP + FP) | 预测为正的里面,有多少是真正正确的 |
| 召回率 (Recall) | TP / (TP + FN) | 真实为正的里面,模型找出了多少 |
举个例子:
假如有100个病人,10个真有病(正类),90个没病(负类)。
模型预测了15个人有病,其中8个真的病了,另外7个是误判。
那么:
TP = 8,FP = 7,TN = 83,FN = 2
准确率 = (8+83)/100 = 91%
精确率 = 8/(8+7) = 53.3%
召回率 = 8/(8+2) = 80%
你看,准确率91%看起来挺高,但精确率只有53%,说明模型报出的阳性有一半是错的。
如果这是癌症筛查,那就麻烦了。
我的个人习惯: 拿到一个分类任务,先算一遍这三个指标,只看准确率很容易被表面数字欺骗。
2. 适用场景:什么时候该看什么?
没有万能指标,关键看你的业务目标是什么。
- 准确率: 适用于正负样本均衡,且两类错误代价差不多的场景。比如垃圾邮件识别?不,垃圾邮件误判一封正常邮件可能很严重,所以准确率其实不太合适。
- 精确率: 当你更在乎“不要误报”时。比如商品推荐系统,如果推荐错了用户会很烦,那你需要高精确率。
- 召回率: 当你更在乎“不要漏掉”时。比如癌症筛查、欺诈检测,宁肯错杀一千,不能放过一个。
很多场景两者都需要权衡,这时候就要看 F1 分数(精确率和召回率的调和平均)。
但这个我们后面再说,先记住一个原则:
业务上“宁可错杀”还是“宁可不杀”?前者看召回,后者看精确。
3. 不平衡数据下的陷阱
这才是重点。
我记得有一次做风控模型,正样本(欺诈)只占1%,负样本99%。
模型学了一招:全部预测为负。准确率直接99%!
老板看了说“不错”,但我心里清楚——这个模型屁用没有,一个欺诈都抓不到。
为什么会这样?
因为准确率在极度不平衡时会被多数类主导。
你算一下:
全部预测为负:
TP=0, FP=0, TN=9900, FN=100
准确率 = 9900/10000 = 99%
这就是经典的“准确率悖论”。
模型什么都没做,但分数好看得要命。
那该用什么指标?
精确率和召回率对少数类更敏感。上面这个模型:
精确率 = 0/(0+0) = 未定义(0/0)
召回率 = 0/100 = 0%
召回率直接归零,撕下伪装。所以不平衡数据下,我通常建议:
- 主要看召回率和精确率,尤其关注少数类的表现
- 结合混淆矩阵,眼见为实
- 考虑使用 PR 曲线(精确率-召回率曲线),比 ROC 更实用
我曾经踩过一个坑: 有个模型在测试集上精确率90%,召回率85%,看着挺好。上线后业务反馈一堆误报。后来发现训练集和线上分布的类别比例不一样,精确率瞬间掉到70%。所以跨环境时要小心指标的稳定性。
4. 我的实战建议
如果你现在正要评估一个分类模型,我的建议是:
- 先打印混淆矩阵。 真数最直接,不要只盯着指标。
- 根据业务代价,自己定一个阈值。 默认0.5不一定最优,可以画精确率-召回率曲线来调。
- 如果不平衡严重,用采样或加权损失。 但最终评估还是用原始分布的数据。
- 多指标互相审查。 精确率、召回率、准确率、F1,哪个异常就追查原因。
我习惯在每次实验报告中都放一张指标对比表,像这样:
模型 准确率 精确率 召回率 F1
----------------------------------------
LR 0.91 0.53 0.80 0.64
RF 0.95 0.78 0.85 0.81
XGB 0.97 0.88 0.92 0.90
一眼就能看出哪个模型更均衡。
下面这张图可以帮你快速理解三者之间的关系: