ROC AUC值为0

时间:2019-02-14 15:12:33

标签: python python-3.x scikit-learn roc

我已经训练了二进制分类器,但是我认为我的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 个答案:

答案 0 :(得分:2)

关于AUC要记住的一件事是,真正重要的是距0.5的距离。如果您的AUC确实很低,那就意味着您的“正”和“负”标签已切换。

从您的分数来看,很明显,低分数(小于〜0.095)意味着1,而高于该阈值的则是0。所以您实际上有一个很好的二进制分类器!

问题在于,默认情况下,较高的分数与标签1相关联。因此,您将分数较高的点标记为1,而不是0。因此,您100%的时间都错了。在这种情况下,只需切换您的预测,您将在100%的时间内正确无误。

简单的解决方法是对pos_label使用sklearn.metrics.roc_curve参数。在这种情况下,您希望您的正标签为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

答案 1 :(得分:0)

@pault 所说的具有误导性

<块引用>

如果您的 AUC 非常低,那仅意味着您的“积极”和 “否定”标签被切换。

AUC=0 意味着

  • 所有真正正面的数据点都被归类为负面
  • 所有真正的负面数据点都归类为 积极的。

AUC=1 意味着有一个阈值,可以完美地分离数据。