如何通过PR曲线在Scikit-learn中评估模型的精确率和召回率?
- 内容介绍
- 文章标签
- 相关推荐
本文共计697个文字,预计阅读时间需要3分钟。
这是最常见的起步卡片点:
解决方法不是换函数,而是加average参数:
-
average='macro':对每个类单独算精确率/召回率,再无权重平均(推荐初筛) -
average='micro':全局统计TP/FP/FN,适合类别不均衡时更稳 -
average=None:返回每个类的原始值,方便查哪一类拖后腿
别漏掉zero_division参数——某类没预测出来时,默认会报UndefinedMetricWarning,设成zero_division=0可静默填0。
画PR曲线必须用precision_recall_curve,不能用classification_report
classification_report只给阈值为0.5时的单点指标,而PR曲线本质是“换一堆阈值,看精确率和召回率怎么 trade-off”。真要画图,得靠precision_recall_curve——它只收概率输出(y_score),不接受硬分类结果(y_pred)。
立即学习“Python免费学习笔记(深入)”;
典型错误是把model.predict(X)传进去,结果得到全0或全1的y_score,画出来就是两条直线。
- 对
LogisticRegression,用model.predict_proba(X)[:, 1]取正类概率 - 对
RandomForestClassifier,同样用predict_proba,别用decision_function(后者不一定存在) - 多分类转二分类?先用
label_binarize把目标类变成1、其余为0,再喂进precision_recall_curve
average_precision_score和PR曲线下面积(AUC-PR)不是一回事
很多人以为average_precision_score(y_true, y_score)就是AUC-PR,其实它默认用的是“近似插值法”(基于precision_recall_curve的点做梯形积分),而严格AUC-PR应从(0,1)开始积分。两者在正样本极少时可能差0.02–0.05。
如果你需要可复现的AUC-PR值,建议显式调用:
from sklearn.metrics import auc precision, recall, _ = precision_recall_curve(y_true, y_score) pr_auc = auc(recall, precision)
注意:auc要求recall单调递减(已由precision_recall_curve保证),别自己排序搞乱顺序。
测试集太小或正样本
PR曲线依赖召回率分段,而召回率 = TP / (TP + FN)。当测试集中正样本总数
这时优先看average_precision_score数值,或改用roc_auc_score(ROC对小样本更鲁棒)。如果业务强依赖PR,唯一办法是扩大测试集,或用交叉验证聚合多折的PR点再平均。
别信“平滑曲线”——有些可视化库自动插值补点,掩盖了数据稀疏问题。原始precision和recall数组长度往往只有正样本数+1,这个数字值得先print出来看看。
本文共计697个文字,预计阅读时间需要3分钟。
这是最常见的起步卡片点:
解决方法不是换函数,而是加average参数:
-
average='macro':对每个类单独算精确率/召回率,再无权重平均(推荐初筛) -
average='micro':全局统计TP/FP/FN,适合类别不均衡时更稳 -
average=None:返回每个类的原始值,方便查哪一类拖后腿
别漏掉zero_division参数——某类没预测出来时,默认会报UndefinedMetricWarning,设成zero_division=0可静默填0。
画PR曲线必须用precision_recall_curve,不能用classification_report
classification_report只给阈值为0.5时的单点指标,而PR曲线本质是“换一堆阈值,看精确率和召回率怎么 trade-off”。真要画图,得靠precision_recall_curve——它只收概率输出(y_score),不接受硬分类结果(y_pred)。
立即学习“Python免费学习笔记(深入)”;
典型错误是把model.predict(X)传进去,结果得到全0或全1的y_score,画出来就是两条直线。
- 对
LogisticRegression,用model.predict_proba(X)[:, 1]取正类概率 - 对
RandomForestClassifier,同样用predict_proba,别用decision_function(后者不一定存在) - 多分类转二分类?先用
label_binarize把目标类变成1、其余为0,再喂进precision_recall_curve
average_precision_score和PR曲线下面积(AUC-PR)不是一回事
很多人以为average_precision_score(y_true, y_score)就是AUC-PR,其实它默认用的是“近似插值法”(基于precision_recall_curve的点做梯形积分),而严格AUC-PR应从(0,1)开始积分。两者在正样本极少时可能差0.02–0.05。
如果你需要可复现的AUC-PR值,建议显式调用:
from sklearn.metrics import auc precision, recall, _ = precision_recall_curve(y_true, y_score) pr_auc = auc(recall, precision)
注意:auc要求recall单调递减(已由precision_recall_curve保证),别自己排序搞乱顺序。
测试集太小或正样本
PR曲线依赖召回率分段,而召回率 = TP / (TP + FN)。当测试集中正样本总数
这时优先看average_precision_score数值,或改用roc_auc_score(ROC对小样本更鲁棒)。如果业务强依赖PR,唯一办法是扩大测试集,或用交叉验证聚合多折的PR点再平均。
别信“平滑曲线”——有些可视化库自动插值补点,掩盖了数据稀疏问题。原始precision和recall数组长度往往只有正样本数+1,这个数字值得先print出来看看。

