1. 程式人生 > >機器學習:圖文詳解模型評估指標ROC/AUC

機器學習:圖文詳解模型評估指標ROC/AUC

模型訓練好,必須要通過各種指標去衡量模型的好壞,也就是模型的泛化能力。模型的評估指標有很多,筆者在剛開始學習的時候,也是搞得焦頭爛額,有時候自己理解了,但又很難跟別人解釋清楚,所以寫下這邊文章。本文主要介紹分類的模型的各種評估指標以及ROC和AUC。

1.混淆矩陣

對於二分類的模型,預測結果與實際結果分別可以取0和1。我們用N和P代替0和1,T和F表示預測正確和錯誤。將他們兩兩組合,就形成了下圖所示的混淆矩陣(注意:組合結果都是針對預測結果而言的)。

P(Positive):代表1
N(Negative):代表0
T(True):代表預測正確
F(False):代表錯誤

混淆矩陣

TP:預測為1,預測正確,即實際1
FP:預測為1,預測錯誤,即實際0
FN:預測為0,預測錯確,即實際1
TN:預測為0,預測正確即,實際0

2.準確率

準確率的定義是預測正確的結果佔總樣本的百分比

公式:準確率=(TP+TN)/(TP+TN+FP+FN)
即,綠色部分和 / ( 綠色部分和 + 紅色部分和 )
無

實際應用場景中,由於樣本不平衡的問題,導致了得到的高準確率結果含有很大的水分。即如果樣本不平衡,準確率就會失效。這樣就衍生出了另外兩個指標:精準率和召回率。

3.精準率

精準率(Precision)又叫查準率,是指在所有被預測為正的樣本中實際為正的樣本的概率

公式:精準率=TP/(TP+FP)
即,綠色部分 / ( 綠色部分 + 紅色部分)
在這裡插入圖片描述

4.召回率

召回率(Recall)又叫查全率,是指在實際為正的樣本中被預測為正樣本的概率

公式:召回率=TP/(TP+FN)
即,綠色部分 / (綠色部分 + 紅色部分)
在這裡插入圖片描述

以信用卡逾期為背景,召回率越高,代表實際逾期使用者被預測出來的概率越高,它的含義類似:寧可錯殺一千,絕不放過一個。所以召回率的提高,往往意味著精準率的下降。

5.F1分數

前面提到,召回率和精準率,也稱查全率和查準率,這兩個指標,我們希望他們同時都很高,但是事與願違,他們是對立的、矛盾的,這就要我們去取捨,找到一個平衡點,這就是F1分數。

F1分數找到一個平衡點,讓查全率和查準率同時達到最大值。

公式:F1 = 2 * 查準率 * 查全率 / (查準率 + 查全率)

6.靈敏度、特異度、真正率、假正率

靈敏度(Sensitivity) = TP/(TP+FN),即實際為正樣本預測成正樣本的概率
特異度(Specificity) = TN/(FP+TN),即實際為負樣本預測成負樣本的概率

真正率(TPR) = 靈敏度 = TP/(TP+FN),即實際為正樣本預測成正樣本的概率
假正率(FPR) = 1- 特異度 = FP/(FP+TN),即實際為負樣本預測成正樣本的概率

我們可以看出:
召回率 = 靈敏度 = 查全率 = 真正率 = TPR = TP/(TP+FN)
都是指:實際正樣本中預測為正樣本的概率

靈敏度/真正率:綠色部分 / (綠色部分 + 紅色部分)
在這裡插入圖片描述

(1-特異度)/假正率:綠色部分 / (綠色部分 + 紅色部分)
在這裡插入圖片描述

我們可以看出:

真正率和假正率這兩個指標跟正負樣本的比例是無關的。
所以當樣本比例失衡的情況下,準確率不如這兩個指標好用。

7.ROC曲線

ROC(Receiver Operating Characteristic)曲線,又稱接受者操作特徵曲線。

在這裡插入圖片描述
這是百度百科的圖片,可以看出,ROC曲線的橫座標是假陽性比值(假正率),縱座標是真陽性比值(真正率)。
假正率反應了模型虛報的響應程度,真正率反應了模型預測響應的覆蓋程度。所以我們希望,假正率越小,真正率越高越好,即虛報的少,覆蓋的多。也就是說,TPR越高,FPR越低,模型就越好。反應到ROC圖形上,也就是取現越陡峭,越朝著左上方突出,模型效果越好。

8.AUC值

AUC是基於ROC曲線的,被稱為曲線下面積(Area Under Curve)

如下圖所示:
在ROC曲線圖上,如果我們連線對角線,它的面積正好是0.5。對角線的實際含義是:隨機判斷響應與不響應,正負樣本覆蓋率應該都是50%,表示隨機效果。ROC曲線越陡越好,所以理想值就是1,一個正方形,而最差的隨機判斷都有0.5,所以一般AUC的值是介於0.5到1之間的。
在這裡插入圖片描述

9.程式碼實現ROC/AUC

from sklearn import metrics
from sklearn.metrics import auc 
import numpy as np
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)
metrics.auc(fpr, tpr) 

0.75