use*_*743 6 python numpy matplotlib scikit-learn precision-recall
我使用sklearn precision_recall_curve函数和matplotlib包绘制了一个精确回忆曲线.对于那些你谁是熟悉的精确召回曲线,你知道一些科学界只能接受它,当它插入,与此类似例子在这里.现在我的问题是,如果你们中的任何人知道如何在python中进行插值?我一直在寻找解决方案,但没有成功!任何帮助将不胜感激.
解决方案: @francis和@ali_m的两个解决方案都是正确的,并且一起解决了我的问题.因此,假设您从precision_recall_curve函数中获得输出sklearn,这是我绘制图形的方法:
precision["micro"], recall["micro"], _ = precision_recall_curve(y_test.ravel(),scores.ravel())
pr = copy.deepcopy(precision[0])
rec = copy.deepcopy(recall[0])
prInv = np.fliplr([pr])[0]
recInv = np.fliplr([rec])[0]
j = rec.shape[0]-2
while j>=0:
if prInv[j+1]>prInv[j]:
prInv[j]=prInv[j+1]
j=j-1
decreasing_max_precision = np.maximum.accumulate(prInv[::-1])[::-1]
plt.plot(recInv, decreasing_max_precision, marker= markers[mcounter], label=methodNames[countOfMethods]+': AUC={0:0.2f}'.format(average_precision[0]))
Run Code Online (Sandbox Code Playgroud)
如果将它们放在for循环中,这些线将绘制插值曲线,并在每次迭代时将每个方法的数据传递给它.请注意,这不会绘制非插值的精确调用曲线.
@francis的解决方案可以使用进行矢量化np.maximum.accumulate。
import numpy as np
import matplotlib.pyplot as plt
recall = np.linspace(0.0, 1.0, num=42)
precision = np.random.rand(42)*(1.-recall)
# take a running maximum over the reversed vector of precision values, reverse the
# result to match the order of the recall vector
decreasing_max_precision = np.maximum.accumulate(precision[::-1])[::-1]
Run Code Online (Sandbox Code Playgroud)
您还可以plt.step用来摆脱for用于绘图的循环:
fig, ax = plt.subplots(1, 1)
ax.hold(True)
ax.plot(recall, precision, '--b')
ax.step(recall, decreasing_max_precision, '-r')
Run Code Online (Sandbox Code Playgroud)
可以执行向后迭代来删除 中增加的部分precision。然后,可以按照 Bennett Brown 对 matplotlib 中垂直和水平线的回答中指定的方式绘制垂直和水平线。
这是示例代码:
import numpy as np
import matplotlib.pyplot as plt
#just a dummy sample
recall=np.linspace(0.0,1.0,num=42)
precision=np.random.rand(42)*(1.-recall)
precision2=precision.copy()
i=recall.shape[0]-2
# interpolation...
while i>=0:
if precision[i+1]>precision[i]:
precision[i]=precision[i+1]
i=i-1
# plotting...
fig, ax = plt.subplots()
for i in range(recall.shape[0]-1):
ax.plot((recall[i],recall[i]),(precision[i],precision[i+1]),'k-',label='',color='red') #vertical
ax.plot((recall[i],recall[i+1]),(precision[i+1],precision[i+1]),'k-',label='',color='red') #horizontal
ax.plot(recall,precision2,'k--',color='blue')
#ax.legend()
ax.set_xlabel("recall")
ax.set_ylabel("precision")
plt.savefig('fig.jpg')
fig.show()
Run Code Online (Sandbox Code Playgroud)
这是一个结果:
| 归档时间: |
|
| 查看次数: |
6589 次 |
| 最近记录: |