了解精确召回曲线和 Precision/Recall 指标

Understanding Precision Recall Curve and Precision/Recall metrics

我想了解为什么少数 class ("1") 的准确率-召回率曲线如此好,而关于准确率 (0,2) 和召回率 (0,4) 的指标因为同样的 class 太糟糕了。 我将 sklearn.metrics.plot_precision_recall_curve 与 pos_label=0(多数 class)和 pos_label=1(少数 class)一起使用。 您可以在下面看到使用的代码。

def plotagem_curvas (nome_modelo, modelo, X_test, y_test, folds, pos_label):
  roc_auc = 0
  ap=0
  if (pos_label == 0):
     classe='Not Stroke'
  else:
     classe='Stroke'
  fig, axs = plt.subplots(1, 2, figsize=(12,4))
  axs[0].set_title("Curva ROC - " + nome_modelo + " \"" + classe + "\"" , fontsize=10)
  disp = metrics.plot_roc_curve(modelo, X_test, y_test, ax=axs[0], pos_label=pos_label)
  roc_auc = disp.roc_auc
  axs[1].set_title("Curva Precision Recall - " + nome_modelo + " \"" + classe + "\"", fontsize=10)
  disp = metrics.plot_precision_recall_curve(modelo, X_test, y_test, ax=axs[1], pos_label=pos_label)
  ap = disp.average_precision
  return (roc_auc, ap)

# Random Forest - Precision_recall curve for both classes (0, 1)
roc_auc, ap = plotagem_curvas ("Random Forest", modelo, X_test, y_test, folds, 0)
roc_auc2, ap2 = plotagem_curvas ("Random Forest", modelo, X_test, y_test, folds, 1)

这是混淆矩阵: Matrix

还有曲线……: Curves

不知道是不是我调用函数“plot_precision_recall_curve”时出错了。

请记住,您的 precision/recall-curves 是针对分类器的不同阈值绘制的(我假设您使用的是随机森林)。

Precision/recall曲线

曲线是计算出来的; “如果我将模型输出为 0.1(或更大)的输入分类为 'stroke',我的 precision/recall 是什么?如果我将模型输出为 0.2(或更大)的输入分类为 'stroke',而不是 0.1,那么 precision/recall 是什么?如果我将分数更改为 0.3、0.4 ...,1",这就是您得到的曲线图。

混淆矩阵

您的混淆矩阵基于单个阈值,即您可能会说“如果我模型中的 score/output 为 0.5 或更大,我将所有对象分类为 'stroke'”(这通常是如果您不更改它,则标准阈值为二进制大小写)。然后根据 单个 阈值对测试集进行分类,并创建混淆矩阵。

因此您的 precision = 0.2recall=0.4(我猜)是基于阈值 0.5,其中您的曲线基于 不同的 阈值告诉你“是否有一个阈值可以在你的准确率和召回率之间做出良好的权衡?”。

获取最优阈值

您可以使用 scikit-learns precision_recall_curve 获得每个阈值的 precision/recall 值,选择最佳 precision/recall 值的阈值,然后 然后 创建你的混淆矩阵。

我假设如果你用它来检查你的模型,当阈值在 0.5 左右时你会发现 0.4 和 0.2 值