【问题标题】:Calculate TPR and FPR of a binary classifier for roc curve in python在python中计算roc曲线的二元分类器的TPR和FPR
【发布时间】:2018-04-21 02:32:30
【问题描述】:

我试图计算真阳性率和假阳性率,然后手动绘制 roc 曲线,因为我想检查从 sklearn.metrics roc_curve 函数获得的 roc 曲线。 但是我得到的 fpr(在 x 轴上)与 tpr(在 y 轴上)的 roc 曲线似乎轴已经互换了。 我正在做一个带有正负两个标签的梯度下降二元分类器。 tpr、fpr计算相关部分tensorflow代码如下:

prediction=tf.nn.softmax(tf.matmul(X,w)+b)
pred_pos= prediction.eval(feed_dict={X: x_pos})
pred_neg= prediction.eval(feed_dict={X: x_neg})
tpr=[]
fpr=[]
for j in range(100):
    pos=0
    neg=0
    n=j/100.
    for i in range(0,len(pred_pos)):
            if(pred_pos[i,1]>=n):
                pos+=1
            if(pred_neg[i,1]>=n):
                neg+=1
    tpr.append(pos/len(x_pos))
    fpr.append(neg/len(x_neg))

f= open('output.txt','wb')
arr=np.array([fpr,tpr])
arr=arr.T          
np.savetxt(f,arr,fmt=['%e','%e'])    
f.close()

然后,我使用带有 fpr(x 轴) 和 tpr(y 轴) 的 gnuplot 从文本文件中进行绘图,并附上绘图。 这肯定是不对的。为什么会这样?我做错了什么?

【问题讨论】:

  • 你的代码看起来很合理;看起来你确实在某处交换了正面和负面。尝试将 tpr 和 fpr 输出到终端,以确保 tpr 更高;如果是,那么问题一定出在您绘制图形的代码中。另请注意,您在arr=np.array([fpr,tpr]) 中首先拥有 fpr。
  • @Stephen 感谢您的评论。是的,我尝试将其输出到终端,并且 tpr 低于 fpr。所以这解释了图表。但是我为另一个涉及 cnn 的网络尝试了相同的代码,并且 roc 曲线看起来很好! tpr 大于 fpr。所以我想知道这个特殊问题有什么问题

标签: python tensorflow roc


【解决方案1】:

我发现了代码的问题。 而不是if(pred_pos[i,1]>=n):,它应该是if(pred_pos[i,0]>=n):(类似于pred_neg), 然后它给出了 fpr 和 tpr 的正确值,其中 tpr 更大。 这是因为数据的标记是为正的 [1,0] 和负的 [0,1] 完成的。所以判断位在预测数组的第0位。

【讨论】:

    猜你喜欢
    • 2017-11-06
    • 2020-04-04
    • 2020-09-19
    • 2014-01-03
    • 2018-05-24
    • 2016-08-27
    • 2017-08-19
    • 2020-05-16
    • 2016-03-23
    相关资源
    最近更新 更多