绘制阈值(precision_recall 曲线)matplotlib/sklearn.metrics
Plotting Threshold (precision_recall curve) matplotlib/sklearn.metrics
我正在尝试绘制 precision/recall 曲线的阈值。我只是使用 MNSIT 数据,示例来自《使用 scikit-learn、keras 和 TensorFlow 进行机器学习实践》一书。尝试训练模型来检测 5 的图像。我不知道你需要看多少代码。我为训练集制作了混淆矩阵,并计算了精度和召回值以及阈值。我绘制了 pre/rec 曲线,书中的示例说要添加轴标签、壁架、网格并突出显示阈值,但代码在书中被切断,我在下面放置了一个星号。我能够弄清楚除了如何让阈值显示在情节上之外的所有内容。我附上了这本书中的图表与我所拥有的图表的对比图。
书上是这样的:
对比我的图表:
我无法显示带有两个阈值点的红色虚线。有谁知道我会怎么做?下面是我的代码:
from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)
def plot_precision_recall_vs_thresholds(precisions, recalls, thresholds):
plt.plot(thresholds, precisions[:-1], "b--", label="Precision")
plt.plot(thresholds, recalls[:-1], "g--", label="Recall")
plt.xlabel("Threshold")
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.)
plt.grid(b=True, which="both", axis="both", color='gray', linestyle='-', linewidth=1)
plot_precision_recall_vs_thresholds(precisions, recalls, thresholds)
plt.show()
我知道这里有很多关于 sklearn 的问题,但 none 似乎涵盖了如何显示红线。非常感谢您的帮助!
您可以使用以下代码绘制水平线和垂直线:
plt.axhline(y_value, c='r', ls=':')
plt.axvline(x_value, c='r', ls=':')
这应该以正确的方式工作:
def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):
recall_80_precision = recalls[np.argmax(precisions >= 0.80)]
threshold_80_precision = thresholds[np.argmax(precisions >= 0.80)]
plt.plot(thresholds, precisions[:-1], "b--", label="Precision", linewidth=2)
plt.plot(thresholds, recalls[:-1], "g-", label="Recall", linewidth=2)
plt.xlabel("Threshold")
plt.plot([threshold_80_precision, threshold_80_precision], [0., 0.8], "r:")
plt.axis([-4, 4, 0, 1])
plt.plot([-4, threshold_80_precision], [0.8, 0.8], "r:")
plt.plot([-4, threshold_80_precision], [recall_80_precision, recall_80_precision], "r:")
plt.plot([threshold_80_precision], [0.8], "ro")
plt.plot([threshold_80_precision], [recall_80_precision], "ro")
plt.grid(True)
plt.legend()
plt.show()
我在尝试复制本书中的代码时遇到了这段代码。结果 @ageron placed all of the resources on his github page. You could check it out here
我正在尝试绘制 precision/recall 曲线的阈值。我只是使用 MNSIT 数据,示例来自《使用 scikit-learn、keras 和 TensorFlow 进行机器学习实践》一书。尝试训练模型来检测 5 的图像。我不知道你需要看多少代码。我为训练集制作了混淆矩阵,并计算了精度和召回值以及阈值。我绘制了 pre/rec 曲线,书中的示例说要添加轴标签、壁架、网格并突出显示阈值,但代码在书中被切断,我在下面放置了一个星号。我能够弄清楚除了如何让阈值显示在情节上之外的所有内容。我附上了这本书中的图表与我所拥有的图表的对比图。 书上是这样的:
我无法显示带有两个阈值点的红色虚线。有谁知道我会怎么做?下面是我的代码:
from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)
def plot_precision_recall_vs_thresholds(precisions, recalls, thresholds):
plt.plot(thresholds, precisions[:-1], "b--", label="Precision")
plt.plot(thresholds, recalls[:-1], "g--", label="Recall")
plt.xlabel("Threshold")
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.)
plt.grid(b=True, which="both", axis="both", color='gray', linestyle='-', linewidth=1)
plot_precision_recall_vs_thresholds(precisions, recalls, thresholds)
plt.show()
我知道这里有很多关于 sklearn 的问题,但 none 似乎涵盖了如何显示红线。非常感谢您的帮助!
您可以使用以下代码绘制水平线和垂直线:
plt.axhline(y_value, c='r', ls=':')
plt.axvline(x_value, c='r', ls=':')
这应该以正确的方式工作:
def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):
recall_80_precision = recalls[np.argmax(precisions >= 0.80)]
threshold_80_precision = thresholds[np.argmax(precisions >= 0.80)]
plt.plot(thresholds, precisions[:-1], "b--", label="Precision", linewidth=2)
plt.plot(thresholds, recalls[:-1], "g-", label="Recall", linewidth=2)
plt.xlabel("Threshold")
plt.plot([threshold_80_precision, threshold_80_precision], [0., 0.8], "r:")
plt.axis([-4, 4, 0, 1])
plt.plot([-4, threshold_80_precision], [0.8, 0.8], "r:")
plt.plot([-4, threshold_80_precision], [recall_80_precision, recall_80_precision], "r:")
plt.plot([threshold_80_precision], [0.8], "ro")
plt.plot([threshold_80_precision], [recall_80_precision], "ro")
plt.grid(True)
plt.legend()
plt.show()
我在尝试复制本书中的代码时遇到了这段代码。结果 @ageron placed all of the resources on his github page. You could check it out here