【问题标题】:Should we plot the roc curve for each class?我们应该为每个类绘制 roc 曲线吗?
【发布时间】:2017-08-09 01:07:18
【问题描述】:

我正在做一个二元分类..我有一个不平衡的数据,我已经使用 svm 权重来试图缓解这种情况...... 如您所见,我已经计算并绘制了每个类的 roc 曲线,并且得到了以下图: 看起来这两个类最多一个..我不确定我是否做对了,因为这是我第一次绘制自己的 roc 曲线...我正在使用Scikit learn to plot ...单独绘制每个类是否正确..分类器是否未能对蓝色类进行分类?

这是我用来获取情节的代码:

y_pred = clf.predict_proba(X_test)[:,0] # for calculating the probability of the first class
y_pred2 = clf.predict_proba(X_test)[:,1] # for calculating the probability of the second class
fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)
auc=metrics.auc(fpr, tpr)
print "auc for the first class",auc

fpr2, tpr2, thresholds2 = metrics.roc_curve(y_test, y_pred2)
auc2=metrics.auc(fpr2, tpr2)
print "auc for the second class",auc2

# ploting the roc curve
plt.plot(fpr,tpr)
plt.plot(fpr2,tpr2)

plt.xlim([0.0,1.0])
plt.ylim([0.0,1.0])
plt.title('Roc curve')
plt.xlabel('False positive rate')
plt.ylabel('True positive rate')
plt.legend(loc="lower right")
plt.show()

我知道有一种更好的方法可以写成字典,但我只是想先看看曲线

【问题讨论】:

  • 你能展示一下你用来获取数据和绘图的代码吗?
  • 当然我会更新我的问题

标签: python machine-learning scikit-learn


【解决方案1】:

查看Wikipedia 条目,了解您对 ROC 曲线的所有需求:)

predict_proba 返回每​​个类的类概率。第一列包含第一类的概率,第二列包含第二类的概率。请注意,这两条曲线是彼此的旋转版本。那是因为类概率加起来为 1。

roc_curve的文档说明第二个参数必须包含

目标分数,可以是正类的概率估计或置信度值。

这意味着您必须传递对应于第 1 类的概率。很可能这是第二列。

您得到蓝色曲线是因为您传递了错误类别的概率(第一列)。只有绿色曲线是正确的。

为每个类别计算 ROC 曲线没有意义,因为 ROC 曲线描述了分类器区分两个类别的能力。每个分类器只有一条曲线。

具体问题是编码错误。

predict_proba 返回类概率(如果肯定是类,则返回 1,如果肯定不是类,则返回 0,通常介于两者之间)。

metrics.roc_curve(y_test, y_pred) 现在将类别标签与概率进行比较,就像将梨与苹果汁进行比较。

您应该使用predict 而不是predict_proba 来预测类别标签而不是概率。这些可以与计算 ROC 曲线的真实类标签进行比较。顺便说一句,这也取消了绘制第二条曲线的选项 - 您只能为分类器获得一条曲线,而不是为每个类获得一条曲线。

【讨论】:

  • 但是在这里他们也使用 predict_proba 来绘制 roc 曲线:cbio.ensmp.fr/~nvaroquaux/scikit-learn/auto_examples/… .... probas_[:, 1] 是什么意思?这是否意味着 1 级?它给出了与我最终得到的曲线相同的曲线!
  • 看来我错了。该函数确实采用估计的概率。然而,你还是犯了一个错误。我会更新答案。
  • 很抱歉,我知道我有很多问题 :( .. 你也可以这样吗:scikit-learn.org/stable/auto_examples/model_selection/… 他们也计算了特定类的 roc 曲线,因此我得到了困惑!如果它应该只用于分类器,他们为什么要为每个类计算它?
  • 此示例将 ROC 曲线扩展到两个以上的类别。他们基本上为每个 1-vs-all 分类做一条曲线。
  • 我明白了,谢谢 .. 现在一切都清楚了 .. 是的,绿色情节是通过发送 1 类(而不是 0)的概率...这就是我应该按照你说的那样保留。 .非常感谢
【解决方案2】:

您必须重新考虑整个方法。 ROC 曲线表示不同“概率”阈值下不同分类器的质量,而不是类别。通常,斜率为 0.5 的直线是分类器的基准,您的分类器是否能够击败随机猜测。

【讨论】:

    【解决方案3】:

    这是因为在为 0 类构建 ROC 时,它会将 y_test 中的“0”视为目标类的布尔 False。

    尝试更改: fpr, tpr, thresholds = metrics.roc_curve(y_test, y_pred)fpr, tpr, thresholds = metrics.roc_curve(1-y_test, y_pred)

    【讨论】:

      猜你喜欢
      • 2018-12-24
      • 2021-03-03
      • 1970-01-01
      • 2016-02-04
      • 2018-11-29
      • 2018-12-19
      • 2019-02-27
      • 2022-01-13
      • 2021-12-06
      相关资源
      最近更新 更多