利用sklearn畫ROC曲線python程式碼個人理解
阿新 • • 發佈:2019-01-08
程式碼註釋
>>> import numpy as np
>>> from sklearn import metrics
匯入metrics模組
>>> y = np.array([1, 1, 2, 2])
假設我們的測試樣本對只有4個,正樣本對label=1,負樣本對label=2
>>> scores = np.array([0.1, 0.4, 0.35, 0.8])
我們的模型對4個樣本對有個打分,一般就是相似度的值
>>> fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2 )
函式roc_curve()輸入三個引數:
y:測試樣本對的label
scores:測試樣本對的相似度的值
pos_label:預設情況下如果label={0,1}或者label={-1,1}兩種情況,引數pos_label可以省略,使用預設值。如果像本例中的情況一樣label={1,2},不是標準型,則pos_label必須等於2
一般會認為較小值為負樣本label,較大值為正樣本label,這裡是個人理解,還沒有經過試驗證實。
首先普及一下FPR與TPR
TP(True Positive):指正確分類的正樣本數,即預測為正樣本,實際也是正樣本。
FP(False Positive):指被錯誤的標記為正樣本的負樣本數,即實際為負樣本而被預測為正樣本,所以是False 。
TN(True Negative):指正確分類的負樣本數,即預測為負樣本,實際也是負樣本。
FN(False Negative):指被錯誤的標記為負樣本的正樣本數,即實際為正樣本而被預測為負樣本,所以是False。
TP+FP+TN+FN:樣本總數。
TP+FN:實際正樣本數。
TP+FP:預測結果為正樣本的總數,包括預測正確的和錯誤的。
FP+TN:實際負樣本數。
TN+FN:預測結果為負樣本的總數,包括預測正確的和錯誤的。
FPR=FP/(FP+TN)(實際的負樣本中有多少被預測為了正樣本,虛警率)
TPR=TP/(TP+FN)(判斷正確的正樣本的比率,命中率)
>>> fpr array([ 0. , 0.5, 0.5, 1. ])
>>> tpr array([ 0.5, 0.5, 1. , 1. ])
>>> thresholds array([ 0.8 , 0.4 , 0.35, 0.1 ])
FPR與TPR的計算過程:
首先,將預測的樣本分數即樣本相似度,從大到小排序(這應該和你使用什麼度量方法有關,如Cos距離,距離越大,說明越是正樣本),排序後返回到thresholds。那麼這個排序後的作用是什麼呢?這就是為什麼這個排序後的結果稱之為“threshold”的原因,我們會將threshold中的每一個值做為一個閾值,然後計算TP、FP、TN和FN,進而計算FPR和TPR。因此,一個閾值對應著一個(FPR,TPR)對,這也會成為roc_curve函式的返回值。以便我們後續利用這些(FPR,TPR)對畫ROC曲線,進一步計算AUC。
下面以上面程式碼結果為例,進行詳細說明。
label: [1, 1, 2, 2 ]
score: [0.1, 0.4, 0.35, 0.8]
thershold:[0.8, 0.4, 0.35, 0.1]
一般認為較小label為負樣本,較大label為正樣本,score>=thershold,即為判斷為正樣本。
thershold=0.8時,TP=1,FP=0, TN=2, FN=1,FPR=FP/(FP+TN)=0/(0+2)=0, TPR=TP/(TP+FN)=1/(1+1)=0.5;
thershold=0.4時,TP=1,FP=1,TN=1,FN=1,FPR=FP/(FP+TN)=1/(1+1)=0.5,TPR=TP/(TP+FN)=1/(1+1)=0.5;
thershold=0.35時,TP=2,FP=1,TN=1,FN=0,FPR=FP/(FP+TN)=1/(1+1)=0.5,TPR=TP/(TP+FN)=2/(2+0)=1.0;
thershold=0.1時,TP=2,FP=2,TN=0,FN=0,FPR=FP/(FP+TN)=2/(2+0)=1.0, TPR=TP/(TP+FN)=2/(2+0)=1.0.
手動計算結果與輸出一致。