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
相关产品推荐
相关产品推荐

