微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

了解 Precision Recall Curve 和 Precision/Recall 指标

如何解决了解 Precision Recall Curve 和 Precision/Recall 指标

我想了解为什么少数类(“1”)的精度-召回曲线如此之好,而同一类的精度(0,2)和召回率(0,4)的指标如此之好坏的。 我使用了 sklearn.metrics.plot_precision_recall_curve 和 pos_label=0(多数类)和 pos_label=1(少数类)。 下面你可以看到使用的代码

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,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,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",0)
roc_auc2,ap2 = plotagem_curvas ("Random Forest",1)

这是混淆矩阵: Matrix

还有曲线...: Curves

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

解决方法

请记住,您的精度/召回曲线是针对分类器的不同阈值绘制的(我假设您使用的是随机森林)。

精度/召回曲线

曲线是这样计算的; “如果我将模型输出为 0.1 的输入分类为‘中风’,我的精度/召回率是多少?如果我将模型输出为 0.2 的输入分类为‘中风’而不是 0.1,那么精度/召回率是多少?还记得吗?如果我将分数更改为 0.3、0.4 ...,1",这就是您得到的曲线图。

混淆矩阵

您的混淆矩阵基于单个阈值,即,您可能会说“如果我的模型的分数/输出为 0.5 或更高,我会将所有对象归类为‘中风’”(这通常是二进制的标准阈值)如果你不改变它)。然后根据单个阈值对测试集进行分类,并创建混淆矩阵。

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

获取最优阈值

您可以使用 scikit-learns precision_recall_curve 获得每个阈值的精度/召回值,为您的最佳精度/召回值选择阈值,然后然后创建您的混淆矩阵。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。