二元分类器过于自信而无法使用 sklearn 绘制 ROC 曲线?

Binary classifier too confident to plot ROC curve with sklearn?

我在 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)

其中 predictions[:,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 Whosebug thread and Whosebug 线程在内的一些消息来源,我预测的极端值可能会给 roc_curve() 带来问题。

我的直觉是正确的吗?如果是这样,我能做些什么来绘制我的 roc_curve 吗?

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

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

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

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