二元分类器过于自信地用sklearn绘制ROC曲线?

时间:2018-04-02 00:22:01

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

我在Tensorflow中创建了一个二进制分类器,它将输出一个包含预测的生成器对象。我将对象的预测(例如[0.98,0.02])提取到列表中,稍后将其转换为numpy数组。我有这些预测的相应标签数组。使用这两个数组我相信我应该能够通过以下方式绘制roc曲线:

import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve

fpr, tpr, thr = roc_curve(labels, predictions[:,1])
plt.plot(fpr, tpr)
plt.show()
print(fpr)
print(tpr)
print(thr)

预测[:,1]给出正预测分数。但是,运行此代码只会产生一条扁平线,每个fpr,tpr和thr只有三个值: Flat line roc plot and limited function outputs.

我所知道的唯一理论是因为我的分类器对它的预测太过肯定了。许多(如果不是全部)正面预测分数为1.0,或非常接近于零:

[[9.9999976e-01 2.8635742e-07]
 [3.3693312e-11 1.0000000e+00]
 [1.0000000e+00 9.8642090e-09]
 ...
 [1.0106111e-15 1.0000000e+00]
 [1.0000000e+00 1.0030269e-09]
 [8.6156778e-15 1.0000000e+00]]

根据包括this stackoverflow线程和this stackoverflow线程在内的一些来源,我预测的极值可能会为roc_curve()创建一个问题。

我的直觉是否正确?如果有的话我可以做些什么来绘制我的roc_curve?

我试图包含我认为与此问题相关的所有信息,但如果您想了解有关我的计划的更多信息,请询问。

1 个答案:

答案 0 :(得分:0)

通过更改预测的阈值并找到每个阈值的灵敏度和特异性来生成ROC。这通常意味着当您增加阈值时,您的灵敏度会降低,但您的特异性会增加,并且会绘制预测概率的整体质量图。在您的情况下,由于所有内容都是0或1(或非常接近它),因此没有有意义的阈值可供使用。这就是为什么thr值基本上是[1,1,1]。

您可以尝试任意将值拉近0.5或者实现自己的ROC曲线计算,并对较小的差异具有更大的容差。

另一方面,您可能想要检查您的网络,因为这样的结果值通常意味着存在问题,可能标签以某种方式泄漏到网络中,因此它会产生完美的结果。