pr曲线比roc更适合极度不平衡数据,因其以精确率和召回率为坐标轴,聚焦正类判别质量;当正样本占比低于1%时,roc因大量负样本稀释fp导致auc虚高,而pr中precision对fp敏感,能真实反映模型在关键区域的失效。

PR曲线比ROC更适合极度不平衡数据的原因
当正样本占比低于1%时,ROC曲线容易掩盖分类器在关键区域的失效——它把大量负样本的真负率(TNR)当作稳定分母,导致AUC虚高。而PR曲线用精确率(Precision)和召回率(Recall)作坐标轴,两者分母分别是预测为正的样本数和真实正样本数,天然聚焦于正类判别质量。
-
Precision = TP / (TP + FP):关注“我猜对了多少个正例” -
Recall = TP / (TP + FN):关注“我漏掉了多少个正例” - 当负样本爆炸多时,
FP极易被稀释,Precision会剧烈波动,这反而是真实信号
用scikit-learn计算PR曲线的三步实操
别直接调precision_recall_curve就完事,漏掉校准和插值会误导判断:
- 先确保模型输出是概率或决策函数得分(不是硬标签),例如用
clf.predict_proba(X)[:, 1]或clf.decision_function(X) - 调用
precision_recall_curve(y_true, y_score),它返回三个等长数组:precision、recall、thresholds - 手动补上端点:首点应为
(precision[0], 0)(召回率为0时精度无定义,按惯例设为最高精度),末点是(1, recall[-1])(阈值→−∞时所有样本判正,召回率=1,精度=正样本占比)
from sklearn.metrics import precision_recall_curve, auc precision, recall, _ = precision_recall_curve(y_true, y_score) # 补端点后计算AUC pr_auc = auc(recall, precision)
画PR曲线时最容易踩的三个坑
- 横纵轴颠倒:必须是
recall为横轴、precision为纵轴,和ROC相反;画反会导致曲线下面积失去可比性
- 未降序排列
recall:原始precision_recall_curve返回的recall数组是降序,但precision对应点不单调,直接plt.plot(recall, precision)会画出锯齿折线;应先对recall升序排序并重排precision
- 忽略基线:不平衡数据下,随机分类器的PR曲线不是对角线,而是水平线
y = pos_ratio(正样本占比),必须画出来才能判断模型是否真有区分力
对比多个分类器时,只看AUC不够可靠
recall为横轴、precision为纵轴,和ROC相反;画反会导致曲线下面积失去可比性recall:原始precision_recall_curve返回的recall数组是降序,但precision对应点不单调,直接plt.plot(recall, precision)会画出锯齿折线;应先对recall升序排序并重排precision
y = pos_ratio(正样本占比),必须画出来才能判断模型是否真有区分力PR AUC整体值容易受低召回区段拖累,而业务往往只关心高精度下的最小可用召回(比如“在精度≥0.9时,最多能抓到多少欺诈订单”):
- 用
np.interp(0.9, precision[::-1], recall[::-1])查精度≥0.9时的最大召回 - 或直接截取
precision >= 0.85的片段,看这段的平均精度/中位召回 - 多个模型在相同精度阈值下比较召回率,比比AUC更贴近部署需求
真正难的是让模型在recall > 0.6时仍保持precision > 0.7——这要求正负样本在特征空间里存在局部可分结构,而不是靠全局阈值硬切。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











