pr曲线在极度不平衡数据中更可靠,因其纵轴precision不依赖负样本数量,避免roc曲线因海量真反例导致fpr失敏而虚高auc,且不隐含fp=fn代价假设,更贴合风控、医疗等场景的实际决策逻辑。

precision_recall_curve 在极度不平衡数据中比 roc_curve 更可靠,不是因为“更高级”,而是因为它的坐标轴(precision 和 recall)天然规避了负样本规模带来的失真。
PR曲线的纵轴不依赖负样本数量
在欺诈检测、罕见病筛查等正样本占比常低于 0.1% 的场景中,fpr = fp / (fp + tn) 的分母包含海量 tn(真反例),导致 fpr 对 fp 变化极不敏感。比如 tn ≈ 999,000 时,fp 从 100 增到 1000,fpr 仅从 0.0001 跳到 0.001——横轴几乎不动,ROC 曲线被“压扁”,AUC 虚高。
而 precision = tp / (tp + fp) 完全不涉及 tn,fp 增加 10 倍会直接让 precision 从 9.1% 断崖跌至 0.99%,变化真实可感。这种敏感性让 PR 曲线能暴露模型在实际部署中“审 100 条,真欺诈几条”的核心问题。
ROC曲线隐含 FP≈FN 的代价假设
ROC 曲线的构造逻辑默认误报(fp)和漏报(fn)代价相当,但现实中完全不成立:
- 在风控中,一个
fp可能只是多打一通电话;一个fn却是放行一笔坏账 - 在医疗筛查中,
fp导致患者焦虑复查;fn可能延误治疗
precision_recall_curve 不做此假设——它只关心正样本预测链路:召回多少、准不准。这与业务决策流一致:先筛出一批“疑似正例”,再逐个验证。
sklearn 中调用时的参数陷阱
用 precision_recall_curve 和 roc_curve 都需要概率输出,但容易忽略三点:
-
predict_proba必须取正类概率:probs[:, 1],而非probs[:, 0]或硬分类结果predict() - 某些模型(如
SVC)默认不输出概率,需显式启用:SVC(probability=True) -
precision_recall_curve返回的precision数组末尾会补一个 1.0(对应阈值=1 时无预测),绘图前建议用recall[:-1], precision[:-1]截断,否则右端点异常抬高
y_true 和 y_score 输入下,auc(recall, precision) 和 auc(fpr, tpr) 会给出差异巨大的数值——这个差异本身,就是数据不平衡对评估逻辑的实质性干扰。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











