最近在对目标检测中的PR曲线做程序实现,发现网上有很多的版本,而且引用https://www.zhihu.com/question/53405779中的一些内容,网上很多的程序在绘制PR曲线中存在一些问题。
使用python+matplotlib 绘制PR曲线的代码应该如下:(其中出现争议的部分是ax.plot(x,y))根据PR曲线,x轴为Recall, y轴为Precision。网上有些代码是反过来的。从matplotlib的源码中很容易可以发现是错误的。
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1, figsize=(5, 5))
ax.plot(recall, precision,color='red')
ax.plot(recall_b, precision_b)
ax.set_xlabel('Recall')
ax.set_ylabel('Precision')
ax.set_xlim(0, 1.01)
ax.set_ylim(0, 1.01)
plt.legend(('a', 'b'), loc='upper right')
fig.tight_layout()
fig.show()
理想的PR曲线两端应该是收敛到1的。从开始的部分精度为1,到结束的部分recall为1.但是可能出现的问题是:有的模型存在一种问题就是(1,信息检索中一定有某几条相关内容(Ground Truth)没有检索出来;2,目标检测中一定有某几个目标(Ground Truth)没有检测出来),即FN不为0.这样带来的问题就是PR曲线在Recall端无法收敛为0.