1. 混淆矩陣
在瞭解ROC之前,我們首先來了解一下混淆矩陣。
對於給出的一個二分類問題,在混淆矩陣中:
-
橫向表示樣本對應的標籤正例和負例的真實情況。
-
縱向表示樣本對應的標籤正例和負例的預測情況。
其中:
- TP: 表示predict爲True, label爲positive的情況。
- FP: 表示predict爲False, label 爲positive的情況。
- TN: 表示predict爲True, label 爲negativ的情況。
- FN: 表示predict爲False, label 爲negative的情況。
在此基礎上衍生出來其他一些評價指標的計算包括:
- 準確率
表示在所有的樣本中,我們預測正確的結果的概率。
- 召回率
表示在所有label爲positive的樣本中,被我們預測爲postive的結果概率。
- 精確率
表示在所有predict爲positive的樣本中,被我們預測正確的結果的概率。
2. ROC
2.1 什麼是ROC
在維基百科中對ROC的解釋:
A receiver operating characteristic curve, or ROC curve, is a graphical plot that illustrates the diagnostic ability of a binary classifier system as its discrimination threshold is varied.
接收器操作特性曲線(ROC曲線)是一個當二進制分類器系統的鑑別閾值變化時,用來說明這個系統判斷能力的曲線。
其中橫軸表示FPR,縱軸表示TPR,其對應的計算方式如下:
- (Recall,Sensitivity)
表示在所有label爲positive的樣本中,預測爲positive的概率
Specificity
- (1-Specificity)
表示在所有label爲negative的樣本中,預測爲positive的概率
所以表示正例中正確率,表示負例中錯誤率。
-
問題1: 對於測試集合而言,我們的計算得到和的結果應該是一個獨立的點,爲什麼會是一條曲線?
-
問題2: 爲什麼通過ROC曲線可以評估模型,什麼樣的ROC曲線表示模型越好,什麼樣的ROC曲線表示模型越差勁?
帶着這兩個問題,我們開始進一步討論ROC如何評估一個分類模型。
2.2 ROC和模型的評估
2.2.1 ROC曲線的繪製
在回答上面的兩個問題之前,我們先來以二分類爲例。
爲什麼對於一個模型我們可以得到一條曲線。
例如以LR爲例,在最後的sigmoid
作爲激活函數之後我們能夠得到一個概率值。
對於這個模型輸出的概率值,我們可以給定一個閾值。
當我們的輸出值大於這個閾值的時候判斷爲正例,當我們的輸出值小於這個閾值的時候判斷爲負例。
那麼,對於同一個模型給定不同的閾值就可以得到不同的和繪製得到ROC曲線。
例如:我們給定多組閾值,然後就可以評估計算出不同閾值下的ROC曲線,具體圖像如下。
2.2.2 ROC曲線的具體意義
還是以LR做二分類爲例子,對於在給定樣本上的預測結果。
- 用紅色線條表示label爲positive的結果,對應分類器輸出值的分佈。
- 用綠色線條表示label爲negative的結果,對應分類器輸出值的分佈。
在的情況下,閾值大於0.5全部預測爲positive,閾值小於0.5全部預測爲negative。
在此基礎上我們考慮以下幾種情況:
第一種情況:
在這種情況下我們
這種情況下分類器能夠完全對區分positive和negative的樣本。
這個時候得到的曲線ROC曲線爲:
第二種情況
在這種情況下,以0.5作爲閾值沒有辦法完全區分樣本中label爲positive和negative的樣本。
交叉部分爲和,這個時候對應的ROC曲線爲如下:
第三種情況
在極端情況下,分類器對所有positive樣本的輸出值分佈和negative樣本輸出的值的分佈是相同的。
這個時候無法通過選取閾值對分類器做有效的分類,對應的ROC曲線如下。
這個時候,分類器對樣本的分類效果是隨機的。
3 AUC
細心的小朋友可能已經發現了,在上面的圖中我們已經給定了不同的狀況下AUC的值。
那麼有兩個問題:
第一個問題: AUC的值表示什麼樣含義?
第二個問題: AUC的值怎麼進行計算?
3.1 AUC值的含義
auc(area under curve)表示ROC曲線下的面積。
在繪製ROC曲線的過程中,Sensitivity和Specificity的值成反比所以當Sensitivity的時候Specificity,反之也成立。
在這種情況下,以0.5作爲閾值沒有辦法完全區分樣本中label爲positive和negative的樣本。
交叉部分爲和,這個時候對應的ROC曲線爲如下:
如圖當我們提高閾值的情況下,我們得到了更多的negative的值,這個時候Specificity(特異性)增加,但是Sensitivity(敏感度)減小。
我們的目的是希望得到一個分類器,在所有閾值的情況下都能夠得到一個對於任何閾值具有比較高的Specificity和Sensitivity。
這個時候,我們通過ROC曲線覆蓋的面積(AUC)來評估模型的效果。
那麼這裏存在一個疑問:爲什麼不用Specificity和Sensitivity的值直接繪製曲線然後計算AUC而是需要用1-Specificity來計算
3.2 AUC值的計算
根據上面的部分的描述,通過不同閾值我們可以繪製出ROC曲線,並且瞭解了AUC曲線那麼在評估模型當中的含義。
那麼怎麼樣計算AUC的值呢?
import numpy as np
a=[0.1, 0.2, 0.4]
b=[0.2, 0.4, 0.6]
print(np.trapz(a,b))
得到的結果爲:
0.09
具體的計算方式:
auc = (0.4-0.2) * (0.1 + 0.2) / 2 + (0.6-0.4) * (0.2 + 0.4) / 2
= 0.03 + 0.06
= 0.09