二进制分类器太自信,无法用Sklearn绘制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只有三个值:平面ROC图和有限的功能输出。

我唯一关于发生这种情况的理论是因为我的分类器太确定了它的预测。许多(如果不是全部(的积极预测分数为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]]

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

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

我试图包括我认为与此问题有关的所有信息,但是如果您想了解有关我的程序的更多信息。

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

您可以尝试任意将其值更接近0.5,或者以更大的差异来实现自己的ROC曲线计算。

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

最新更新