1. 程式人生 > >sklearn.metrics.roc_curve解析

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

y_scorepos_label=Nonesample_weight=Nonedrop_intermediate=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)