代码之家  ›  专栏  ›  技术社区  ›  Eden Trainor

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

  •  0
  • Eden Trainor  · 技术社区  · 7 年前

    我在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\U curve()带来问题。

    我的直觉正确吗?如果是这样的话,我能做些什么来绘制我的roc\U曲线吗?

    我已经试着把我认为与这个问题相关的所有信息都包括进来,但是如果你想了解更多关于我的项目的信息,请询问。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Peter Szoldan    7 年前

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

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

    另一方面,您可能希望查看您的网络,因为这样的结果值通常意味着存在问题,可能标签以某种方式泄漏到网络中,从而产生完美的结果。