我们应该为每个类别绘制ROC曲线吗?

5
我正在进行二元分类,我的数据不平衡,我使用了svm权重来尝试减轻这种情况...如你所见,我已经计算并绘制了每个类别的roc曲线,并得到了以下图表:enter image description here看起来两个类别合为一类...我不确定我是否做对了,因为这是我第一次画自己的roc曲线...我在使用Scikit learn绘图...单独绘制每个类别的图表是否正确...分类器是否在无法分类蓝色类别? 以下是我用来获取图表的代码:
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()

我知道有更好的方法来编写字典,但我只是想先看看曲线。


你能展示一下你用来获取数据和绘图的代码吗? - piman314
1
当然,我会更新我的问题。 - Ophilia
3个回答

4
请查看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曲线:http://cbio.ensmp.fr/~nvaroquaux/scikit-learn/auto_examples/plot_roc.html ...... probas_[:,1]是什么意思?它是否表示类别1的概率?它给出了与我得到的相同的曲线! - Ophilia
看起来我错了。这个函数确实需要估计概率。然而,你还是犯了一个错误。我会更新答案。 - MB-F
非常抱歉,我知道我有很多问题:(..你能否也看一下这个链接:http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html 他们还为特定类别计算了ROC曲线,因此我感到困惑!如果应该只针对分类器进行计算,为什么要为每个类别计算呢? - Ophilia
这个例子将 ROC 曲线扩展到超过两个类别。它们本质上为每个 1 对所有分类做一个曲线。 - MB-F
我明白了,谢谢。现在一切都清楚了。是的,绿色的图表是通过发送类别1(而不是0)的概率来生成的。正如你所说,这就是我应该保留的。非常感谢。 - Ophilia
每个分类器只有一个曲线。正确。特别地,从对类的给定解释所对应的ROC曲线开始,通过沿着下降对角线(⟍)反射图表可以获得相反类别(T<->F)的ROC曲线。这是因为TPr+FPr'=TNr'+FPr'=1和FPr+TPr'=FPr+TNr=1。 - Luca Citi

0

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


0

这是因为在构建类别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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接