精确率、召回率、F1 与准确率
四个描述分类器的数字,各自回答一个具体问题。选错了指标,你就会朝错误的方向优化。
分类器只回答是或否。它做出的每个预测都会落进四个格子中的一个,而所有分类指标都只是这四个计数之间不同的比值。把格子搞懂,这些指标就不再是需要背的公式。
假设你做了一个标记欺诈交易的模型。对每一笔交易,它预测是不是欺诈,而现实也是或不是。这样就得到四种结果:
- 真正例(TP): 标记为欺诈,而且确实是欺诈。
- 假正例(FP): 标记为欺诈,其实是正常交易。
- 假负例(FN): 当作正常交易放过,其实是欺诈。
- 真负例(TN): 放过,而且确实是正常交易。
准确率:会骗人的那个
准确率是预测中正确的比例:(TP + TN) / everything。
这是所有人第一个想到的指标,而恰恰在类别不平衡的时候,它有误导性。如果 1000 笔交易里只有 1 笔是欺诈,一个什么都不标记的模型准确率高达 99.9%,却一笔欺诈都没抓到。数字近乎完美,模型一文不值。
准确率回答的是「我答对了多少」——只有在类别均衡、且两类错误的代价相同时,这个问题才成立。而在欺诈检测、医学筛查、垃圾邮件,以及大多数真实问题里,这两个条件一个都不满足。只要看一眼混淆矩阵,这个缺陷就立刻现形。
精确率:你标记出来的有多少是真的
精确率(precision)是 TP / (TP + FP)——模型判为欺诈的所有交易里,真正是欺诈的比例。
精确率高意味着误报少。当对一次正例采取行动的代价高昂或很烦人时,你就该关心精确率:冻结客户的卡、派安全团队去查、自动删掉一封邮件。精确率 0.7 意味着你有 30% 的告警在浪费别人的时间。
召回率:真正存在的问题你抓到了多少
召回率(recall)是 TP / (TP + FN)——所有真正欺诈中,模型抓到的比例。
召回率高意味着漏掉的少。当漏掉一次正例代价高昂时,你就该关心召回率:没被发现的欺诈、被读成正常的肿瘤、被漏掉的关键安全告警。召回率 0.7 意味着 30% 的真实欺诈从眼皮底下溜走了。
权衡本身就是重点
精确率和召回率互相拉扯。标记得更激进,你抓到更多真实欺诈(召回率上升),但误报也更多(精确率下降)。标记得保守则相反。你通过调整判定阈值来在这条曲线上移动——分数超过阈值就判为正例。
没有普遍正确的平衡点。它取决于两类错误的相对代价:
- 癌症筛查选择召回率。漏掉一个肿瘤,远比一次误报(后续复查就能排除)糟糕得多。
- 垃圾邮件过滤器选择精确率。删掉一封真邮件,比放过一些垃圾邮件更糟。
决定这个比例是产品决策,不是建模决策。指标只是把这个权衡摆到明面上。
F1:非要一个数的时候
有时你需要一个分数来给模型排序。F1 分数就是精确率和召回率的调和平均数:
F1 = 2 * (precision * recall) / (precision + recall)
与普通平均数不同,调和平均数会惩罚失衡。精确率 1.0、召回率 0.0,平均下来是 0.5,F1 却是 0——这是对的,因为一个什么都抓不到的模型毫无用处,它的(空)告警再干净也没用。只有两者都高,F1 才高。
F1 给精确率和召回率相同的权重。当两者重要性不等时,Fβ 会倾斜天平——F2 更看重召回率,F0.5 更看重精确率——但到了这一步,通常更好的做法是分别报告精确率和召回率,让读者直接看到这个权衡。
把四个指标放在一起看
没有任何一个数字能单独给出答案。一个好习惯:把精确率和召回率成对报出来,只有在结构上必须用一个标量时才压缩成 F1 或准确率(排行榜、仪表盘上的一个格子)。另外永远先看类别是否均衡——它马上就能告诉你准确率是可以放心信,还是一个陷阱。想看让这一切变得直观的那张图,以及特异度、假正例率这些衍生指标,去看混淆矩阵。
要点回顾
- 每个预测都是 TP、FP、FN 或 TN 之一;每个指标都是这四个数的某种比值。
- 准确率在类别不平衡时会误导你——一个什么都不做的模型也能拿到接近满分。
- 精确率 = 你标记出来的里面有多少是真的;误报代价高时优化它。
- 召回率 = 真正存在的里面你抓到了多少;漏掉代价高时优化它。
- 精确率和召回率通过阈值互相权衡;F1(调和平均数)把它们压缩成一个数,只要有一个不高,它就高不了。
下一篇: 混淆矩阵