sklearn.metrics.roc_curve解析
官方網址:http://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics
首先認識單詞:metrics: ['mɛtrɪks] : 度量‘指標
curve : [kɝv] : 曲線
這個方法主要用來計算ROC曲線面積的;
sklearn.metrics.
roc_curve
(y_true,
Parameters :
y_true : 陣列,shape = [樣本數]
在範圍{0,1}或{-1,1}中真正的二進位制標籤。如果標籤不是二進位制的,則應該顯式地給出pos_label
y_score : 陣列, shape = [樣本數]
目標得分,可以是積極類的概率估計,信心值,或者是決定的非閾值度量(在某些分類器上由“decision_function”返回)。
pos_label:int or str, 標籤被認為是積極的,其他的被認為是消極的。
sample_weight: 顧名思義,樣本的權重,可選擇的
drop_intermediate: boolean, optional (default=True)
是否放棄一些不出現在繪製的ROC曲線上的次優閾值。這有助於建立更輕的ROC曲線
Returns :
fpr : array, shape = [>2] 增加假陽性率,例如,i是預測的假陽性率,得分>=臨界值[i]
tpr : array, shape = [>2] 增加真陽性率,例如,i是預測的真陽性率,得分>=臨界值[i]。
thresholds : array, shape = [n_thresholds]
減少了用於計算fpr和tpr的決策函式的閾值。閾值[0]表示沒有被預測的例項,並且被任意設定為max(y_score) + 1
要弄明白ROC的概念可以參考 :https://www.deeplearn.me/1522.html
介紹ROC曲線的兩個重要指標:
真陽性率 = true positive rate = TPR = TP/ (TP + FN)
可以這樣理解:真陽性率就是在標準的陽性(標準的陽性就等於真陽性加假陰性=TP + FN)中,同時被檢測為陽性的概率,有點繞,自行理解。
假陽性率 = false positive rate = FPR = FP / (FP+TN)
可以這樣理解:假陽性就是在標準的陰性(標準的陰性就等於假陽性加真陰性=FP + TN)中,被檢測為陽性的概率。很好理解的,本來是陰性,檢測成了陽性的概率就是假陽性率唄。
ROC曲線就由這兩個值繪製而成。接下來進入sklearn.metrics.roc_curve實戰,找遍了網路也沒找到像我一樣解釋這麼清楚的。
import numpy as np
from sklearn import metrics
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
y 就是標準值,scores 是每個預測值對應的陽性概率,比如0.1就是指第一個數預測為陽性的概率為0.1,很顯然,y 和 socres應該有相同多的元素,都等於樣本數。
pos_label=2 是指在y中標籤為2的是標準陽性標籤,其餘值是陰性。所以在標準值y中,陽性有2個,後兩個;陰性有2個,前兩個。
接下來選取一個閾值計算TPR/FPR,閾值的選取規則是在scores值中從大到小的以此選取,於是第一個選取的閾值是0.8
scores中大於閾值的就是預測為陽性,小於的預測為陰性。所以預測的值設為y_=(0,0,0,1),0代表預測為陰性,1代表預測為陽性。可以看出,真陰性都被預測為陰性,真陽性有一個預測為假陰性了。
FPR = FP / (FP+TN) = 0 / 0 + 2 = 0
TPR = TP/ (TP + FN) = 1 / 1 + 1 = 0.5
thresholds = 0.8
我們驗證一下結果
print(fpr[0],tpr[0],thresholds[0])
同程式碼結果一致,其餘的就不演示了,剩下的閾值一次等於 0.4 0.35 0.1 自行驗證。
最後結果等於
print(fpr,'\n',tpr,'\n',thresholds)
全部程式碼
import numpy as np
from sklearn import metrics
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
print(fpr,'\n',tpr,'\n',thresholds)