ROC AUC值为0。

4
我是一名有用的助手,可以为您翻译文本。
我已经训练了一个二元分类器,但我认为我的ROC曲线不正确。 这是包含标签的向量:
y_true= [0, 1, 1, 1, 0, 1, 0, 1, 0]

和第二个向量是得分向量
y_score= [
    0.43031937, 0.09115553, 0.00650781, 0.02242869, 0.38608587, 
    0.09407699, 0.40521139, 0.08062053, 0.37445426
]

当我绘制ROC曲线时,我得到了以下结果:

enter image description here

我认为代码是正确的,但我不明白为什么会得到这个曲线以及为什么tprfprthreshold列表的长度为4。为什么我的AUC等于零?

fpr [0.   0.25 1.   1.  ]
tpr [0. 0. 0. 1.]
thershold [1.43031937 0.43031937 0.37445426 0.00650781]

我的代码:

import sklearn.metrics as metrics

fpr, tpr, threshold = metrics.roc_curve(y_true, y_score)
roc_auc = metrics.auc(fpr, tpr)

# method I: plt
import matplotlib.pyplot as plt
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
2个回答

4
需要翻译的内容如下:

需要记住关于AUC的一件事情,那就是离0.5越远越重要。如果你的AUC非常低,那么只是意味着你的“正”和“负”标签被交换了。

从你的得分来看,很明显,低得分(小于约0.095)表示为1,任何高于该阈值的得分则为0。所以,你实际上拥有一个很好的二元分类器!

问题在于,默认情况下,较高的得分与标签1相关联。因此,你将高得分的点标记为1而不是0。因此,你的预测100%错误。在这种情况下,只需切换你的预测,你就可以100%正确。

简单的解决方法是使用sklearn.metrics.roc_curve中的pos_label参数。在这种情况下,你希望你的正标签为0。

fpr, tpr, threshold = metrics.roc_curve(y_true, y_score, pos_label=0)
roc_auc = metrics.auc(fpr, tpr)
print(roc_auc)
#1.0

谢谢您的回复,我认为我的分数和标签是错误的。我刚刚发布了我的完整代码,对于分数,我使用了余弦相似度,对于标签,我使用了值0和1。我所说的0和1是指如果两个人脸相似,则将值设置为1,如果两个人脸不同,则将标签设置为0,因此我得到了一个预测的0 1向量和一个包含余弦相似度的分数向量,因此我正在间接地分类两个输入人脸。希望您能回答我的问题@pault。 - Guizmo Charo

1

我认为@pault所说的是误导性的。

如果您的AUC非常低,那就意味着您的“正”和“负”标签被交换了。

AUC=0表示

  • 所有真正的正数据点都被分类为负或者
  • 所有真正的负数据点都被分类为正。

AUC=1表示存在一个阈值,可以完美地分离数据。


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