You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sklearn中precision_recall_curve最后一个precision值为1是否合理?

处理sklearn precision_recall_curve输出的最后一个冗余点

核心结论

你完全可以直接移除最后一个点来满足需求,这是合理且常用的处理方式。

为什么会出现这个冗余点?

sklearn的precision_recall_curve函数默认会额外添加一个点:当阈值高于所有预测概率时,没有任何样本被判定为正类。此时:

  • recall(召回率)为0,因为没有正类样本被正确识别
  • precision(精确率)被定义为1(数学上,没有假阳性的情况下精确率无意义,但sklearn做了这样的约定)

这个点更多是出于算法逻辑的完整性,对实际绘图、模型对比几乎没有价值,确实容易造成误导。

具体处理方法

直接截取precision和recall数组的前n-1个元素即可,代码示例:

import numpy as np
from sklearn import metrics

y = np.array([0, 0, 1, 0])
pred = np.array([0.1, 0.2, 0.3, 0.4])
precision, recall, thresholds = metrics.precision_recall_curve(y, pred, pos_label=1)

# 移除最后一个冗余点
precision_clean = precision[:-1]
recall_clean = recall[:-1]

print("处理后的precision:", precision_clean)
print("处理后的recall:", recall_clean)

输出结果完全符合你的预期:

处理后的precision: array([0.25      , 0.33333333, 0.5       , 0.        ])
处理后的recall: array([1., 1., 1., 0.])

补充说明

如果你需要绘制PR曲线,使用处理后的数组即可,不会影响曲线的准确性——这个冗余点只是在PR曲线的终点(recall=0)额外多了一个无意义的点,移除后曲线的核心趋势和评估指标(如AP值)不会受到影响。

内容的提问来源于stack exchange,提问作者Daniel Wyatt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:33:14