2017-11-08 41 views
1

True Positive Rate와 False Positive Rate를 계산하고 난 후 roc 곡선을 그려 봅니다. Sklearn에서 얻은 roc 곡선을 확인하고 싶었 기 때문에 .metrics roc_curve 함수. 그러나 fpr (x 축)과 tpr (y 축)의 roc 곡선은 축이 상호 교환 된 것처럼 보입니다. 두 개의 양수 및 음수 레이블이있는 그라디언트 디센트 바이너리 분류자를 수행하고 있습니다.파이썬에서 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을 이용하여 텍스트 파일 플로팅있어, 및 I : TPR에 대한 tensorflow 코드의 관련 부분은 FPR 계산은 아래 주어진 음모가 붙어 있어요. roc curve fpr vs tpr 이것은 분명 옳지 않습니다. 이게 왜 그렇게? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 미리 감사드립니다!

+0

코드가 적당합니다. 당신이 어딘가에 긍정과 네거티브를 교환 한 것처럼 보입니다. 터미널에 tpr 및 fpr을 출력하여 tpr이 더 높은지 확인하십시오. 그렇다면 그래프를 그리기위한 문제가 코드에 있어야합니다. 또한 당신은'arr = np.array ([fpr, tpr])'에 fpr을 가지고있다. – Stephen

+0

@Stephen 의견을 보내 주셔서 감사합니다. 예, 터미널로 출력을 시도했지만 tpr은 fpr보다 낮습니다. 그래서 그래프가 설명됩니다. 그러나 나는 cnn과 관련된 다른 네트워크에 대해 동일한 코드를 시도했지만 roc 커브는 잘 보였다! tpr은 fpr보다 큼. 그래서이 특별한 문제가 무엇이 문제인지 궁금합니다. – abhih1

답변

0

코드와 관련된 문제점을 발견했습니다. if(pred_pos[i,1]>=n): 대신 if(pred_pos[i,0]>=n):이어야하며 (마찬가지로 pred_neg의 경우) 이어야하며 fpr 및 tpr에 대해 올바른 값을 제공하고 tpr은 더 커야합니다. 데이터의 레이블 지정은 양수에 대해 [1,0] 및 음화에 대해 [0,1]로 수행 되었기 때문에 발생했습니다. 따라서 결정 비트는 예측 배열의 0 번째 위치에있었습니다.