评分函数基础:准确率、精确率、召回率、F1-score
做分类模型,避不开这四个指标。说实话,我刚开始做模型评估时,也犯过只看准确率的错误。今天咱们把这四个指标掰开揉碎讲清楚。你想想看,一个模型好不好,不能光凭感觉,得用数字说话。
准确率——最直观,也最容易骗人
准确率是什么?就是预测对的样本数,除以总样本数。
Accuracy = (TP + TN) / (TP + TN + FP + FN)
但这里有个大坑。我个人的经验,在类别极度不平衡时,准确率就是个数字游戏。举个例子,欺诈检测里,99% 都是正常交易。模型全部预测为「正常」,准确率也是 99%。你说这模型有用吗?半点用没有。
注意:类别严重不平衡时,千万别只看准确率。我曾经在一个信贷评估项目里,就被准确率骗过,还好上线前做了二次验证。
精确率 vs 召回率——一对跷跷板
这两个指标,说白了就是个权衡问题。精确率关注的是「找得准不准」,召回率关注的是「找得全不全」。
Precision = TP / (TP + FP) # 你预测为正例的那些里,有多少是真的正例
Recall = TP / (TP + FN) # 真正的正例里,你找出来了多少
我之前在信贷风控项目里就吃过这个亏。精确率做得太高,结果把很多能通过的人给拒了;召回率拉上去,又放进来一堆坏账。两者的取舍,完全取决于业务场景。我给你列个对照表,你一看就明白。
| 业务场景 | 优先指标 | 为什么 |
|---|---|---|
| 医疗诊断(癌症筛查) | 召回率 | 漏掉一个病人,代价太大了 |
| 垃圾邮件过滤 | 精确率 | 把正常邮件误判成垃圾,用户体验极差 |
| 欺诈检测 | 召回率 | 放过一笔欺诈,损失可能很大 |
| 商品推荐 | 精确率 | 推一堆用户不感兴趣的,反而影响留存 |
我的习惯:如果业务方说不清楚优先哪个,我会建议先按 F1-score 调优,再根据线上反馈微调。
F1-score——调和平均,兼顾两个指标
F1-score 是精确率和召回率的调和平均数。为什么要调和而不是直接平均?因为直接平均会让一个高一个低的情况看起来很美好,但调和平均不会。只有两者都高,F1-score 才会高。
F1 = 2 * (Precision * Recall) / (Precision + Recall)
记得我在做文本分类项目时,发现模型精确率 0.95,召回率只有 0.45。直接平均(0.70)看着还行,但 F1-score 只有 0.61。这就是真实水平。嗯,这个小坑,希望能帮你拔掉。
怎么选?看场景
- 做报告、做基线:用 F1-score,它不偏不倚
- 业务有明确代价:定义自己的加权指标,比如加权重召回率
- 多分类任务:用宏平均(Macro F1)或微平均(Micro F1),取决于类别是否均衡
- 极度不平衡:考虑用 AUC、PR 曲线,或者干脆用 Precision@K / Recall@K
动手算一下——Python 代码示例
光说不练假把式,我给你准备了一段代码。在我自己的项目中,这段代码几乎是每个模型的标配函数。
from sklearn.metrics import accuracy_score, precision_score
from sklearn.metrics import recall_score, f1_score
y_true = [1, 0, 1, 1, 0, 1, 0, 0, 1, 0]
y_pred = [1, 0, 0, 1, 0, 1, 1, 0, 1, 0]
acc = accuracy_score(y_true, y_pred)
prec = precision_score(y_true, y_pred)
rec = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
print(f"准确率: {acc:.3f}")
print(f"精确率: {prec:.3f}")
print(f"召回率: {rec:.3f}")
print(f"F1-score: {f1:.3f}")
# 输出结果
准确率: 0.800
精确率: 0.833
召回率: 0.833
F1-score: 0.833
看到没?数字不会骗人,但会误导人。只有你理解了每个指标的含义,才能做出正确的判断。
补充一张结构图,帮你理清关系
下面这张图展示了四个指标和混淆矩阵之间的关联。箭头方向代表计算路径。
核心总结:准确率只适合完美平衡的数据;精确率和召回率是一对冤家,选哪个看业务有多「怕犯错」;F1-score 是万能钥匙,但也不是银弹。理解这些,你就能对模型的表现,心里有个谱了。