在python中计算roc曲线的二元分类器的TPR和FPR

时间:2017-11-08 11:57:22

标签: python tensorflow roc

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

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从文本文件中绘图,并且我正在附加绘图。 roc curve fpr vs tpr这当然不对。为什么会这样?我做错了什么?

1 个答案:

答案 0 :(得分:1)

我发现了代码的问题。 而不是if(pred_pos[i,1]>=n):它应该是if(pred_pos[i,0]>=n):(类似于pred_neg), 然后它为fpr和tpr提供正确的值,tpr更大。 这是因为数据的标记对于正数为[1,0],对于负数为[0,1]。因此,确定位位于预测数组的第0位。