roc全稱是「受試者工作特徵」(receiver operating characteristic)。roc曲線的面積就是auc(area under the curve)。auc用於衡量「二分類問題」機器學習演算法效能(泛化能力)。
python中sklearn直接提供了用於計算roc的函式[1],下面就把函式背後的計算過程詳細講一下。
首先,解釋幾個二分類問題中常用的概念:true positive
,false positive
,true negative
,false negative
。它們是根據真實類別與**類別的組合來區分的。
假設有一批test樣本,這些樣本只有兩種類別:正例和反例。機器學習演算法**類別如下圖(左半部分**類別為正例,右半部分**類別為反例),而樣本中真實的正例類別在上半部分,下半部分為真實的反例。
樣本中的真實正例類別總數即tp+fn。tpr
即true positive rate,tpr = tp/(tp+fn)。
同理,樣本中的真實反例類別總數為fp+tn。fpr
即false positive rate,fpr=fp/(tn+fp)。
還有乙個概念叫」截斷點」。機器學習演算法對test樣本進行**後,可以輸出各test樣本對某個類別的相似度概率。比如t1是p類別的概率為0.3,一般我們認為概率低於0.5,t1就屬於類別n。這裡的0.5,就是」截斷點」。
總結一下,對於計算roc,最重要的三個概念就是tpr
,fpr
,截斷點
。
截斷點
取不同的值,tpr
和fpr
的計算結果也不同。將截斷點
不同取值下對應的tpr
和fpr
結果畫於二維座標系中得到的曲線,就是roc曲線。橫軸用fpr表示。
sklearn給出了乙個計算roc的例子[1]。
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)
通過計算,得到的結果(tpr
,fpr
,截斷點
)為
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畫到二維座標中,得到的roc曲線如下(藍色線條表示),roc曲線的面積用auc表示(淡黃色陰影部分)。
上例給出的資料如下
y = np.array([1
,1,2
,2])
scores = np.array(
[0.1
,0.4
,0.35
,0.8
])
用這個資料,計算tpr,fpr的過程是怎麼樣的呢?
y是乙個一維陣列(樣本的真實分類)。陣列值表示類別(一共有兩類,1和2)。我們假設y中的1表示反例,2表示正例。即將y重寫為:
y_true =[0
,0,1,1]
score即各個樣本屬於正例的概率。
樣本**屬於p的概率(score)
真實類別
y[0]
0.1n
y[2]
0.35
py[1]
0.4n
y[3]
0.8p
將截斷點
依次取值為0.1,0.35,0.4,0.8時,計算tpr
和fpr
的結果。
說明只要score>=0.1,它的**類別就是正例。
此時,因為4個樣本的score都大於等於0.1,所以,所有樣本的**類別都為p。
說明只要score>=0.35,它的**類別就是p。
此時,因為4個樣本的score有3個大於等於0.35。所以,所有樣本的**類有3個為p(2個**正確,1乙個**錯誤);1個樣本被**為n(**正確)。
說明只要score>=0.4,它的**類別就是p。
此時,因為4個樣本的score有2個大於等於0.4。所以,所有樣本的**類有2個為p(1個**正確,1乙個**錯誤);2個樣本被**為n(1個**正確,1乙個**錯誤)。
說明只要score>=0.8,它的**類別就是p。所以,所有樣本的**類有1個為p(1個**正確);3個樣本被**為n(2個**正確,1乙個**錯誤)。
用下面描述表示tpr和fpr的計算過程,更容易記住
最理想的分類器,就是對樣本分類完全正確,即fp=0,fn=0。所以理想分類器tpr=1,fpr=0。
roc計算公式,
《機器學習》,周志華
詳解kenlm語言模型計算過程
import kenlm model kenlm.language tri gram language model.arpa score model.score 銀行 放貸 行為 print score 7.153961658477783 score model.score 銀行 放待 行為 pri...
遞迴計算過程和迭代計算過程
這次主要想通過幾個sicp的題目來說明遞迴計算過程和迭代計算過程。1 階乘 遞迴計算過程 define factorial n if n 1 1 factorial n 1 n 迭代計算過程 define fact iter counter result if counter 1 result fa...
PinBlock計算過程
引數 密碼,賬號,leftpinkey,rightpinkey out data 該引數為了帶出計算出來的pinblock 1先將密碼轉換為bcd碼 注意,轉碼後長度會變化,eg ascii碼的6位密碼轉成bcd碼後會縮短 放入pinblock定義好的16個長度的空字元陣列中 2再將賬號轉換為bcd...