AUC 指標
直觀意義
AUC 指標用於評價分類器對於正、負樣例的辨別能力,對出結果的排序位置(按照預測為正例的概率)敏感。
為什么提出這個指標?
一般來講,精確率、召回率等指標,都需要設定一個閾值去判別是屬於正類還是負類,例如預測分大於等於0.5判別為正類,小於0.5判別為負類。如何設定這個閾值,是個問題。而AUC這個指標則不需要設閾值。(或者說,每種閾值的情況都考慮了,下面介紹)
計算方式
利用ROC所圍面積計算
ROC 如何計算
要計算ROC需要明確混淆矩陣的概念
首先,混淆矩陣中有着Positive、Negative、True、False的概念,其意義如下:
- 算法給出的,預測類別為1的為Positive(陽性),預測類別為0的為Negative(陰性)
- 數據集中,真實類別為1的為True(真), 真實類別為0的為False(偽)
於是就有這個混淆矩陣圖:
其次, ROC 使用的是True Positive Rate(真陽率)、False Positive(偽陽率)兩個概念:
其中,\(P\) 是所有真實標簽為1的數量,\(N\)是所有真實標簽為0的數量
因此,
TPRate的意義是所有真實類別為1的樣本中,預測類別為1的比例。
FPRate的意義是所有真實類別為0的樣本中,預測類別為1的比例。
這兩個指標均指出公式圍繞預測類別為1進行討論。
繪制ROC曲線:
曲線的起點和終點是(0,0)和(1,1)
如果\(TPR=FPR\) 即隨機猜測,如圖所示
舉個簡單栗子:
通過上述混淆矩陣算法,我們可以得到
進而算得TPRate=3/4,FPRate=2/4,得到ROC曲線:
上述栗子是一個硬分類問題,也就是預測結果要么0,要么1. 如果給出預測概率的呢?下面的栗子:
這時候,我們只需要設置一個閾值,就可以把上面的預測概率轉換為0,1這樣的硬分類結果,然后套用上面的操作即可畫出當前閾值的一個點。
利用ROC面積計算AUC
- AUC = 1,是完美分類器,采用這個預測模型時,存在至少一個閾值能得出完美預測。絕大多數預測的場合,不存在完美分類器。
- 0.5 < AUC < 1,優於隨機猜測。這個分類器(模型)妥善設定閾值的話,能有預測價值。
- AUC = 0.5,跟隨機猜測一樣(例:丟銅板),模型沒有預測價值。
- AUC < 0.5,比隨機猜測還差;但只要總是反預測而行,就優於隨機猜測。
上面提到當設置一個閾值就可以得到 ROC 曲線上的一個點,對於 AUC 計算,我們實際上就是要把所有閾值都考慮進去(也就是上文提出使用AUC指標的要解決的問題)。
如下圖中,我們要設置閾值為0.8,0.6,0.5,0.3
依次計算\(TPR,FPR\),進而繪制 ROC 曲線
上圖給出了一個很簡單的例子。四個樣本,按預測分高到低排序,從上到下依次找到四個閾值(紅線),每個閾值的情況下,分別計算出TPR和FPR(分子只統計紅線上面的,因為紅線下面在閾值以下,也就是說都是預測為陰性的結果,不在公式的計數范圍內),並描點,再用線段相連,最后計算出曲線下面的面積(該例子AUC=0.75)。
注:
如果按照閾值排序后,有相同的閾值,那么也是重復計算,只需按照每次下移一行畫紅線即可
概率角度
一種本質的理解為: 隨機給定一個正樣本和一個負樣本,分類器輸出該正樣本為正的那個概率值 比 分類器輸出該負樣本為正的那個概率值 要大的可能性。
暴力求解
按照上面提到的,我們需要統計隨機抽取的一對樣本,按照上述含義進行計算,即一下公式
舉個栗子:
ID | label | probability |
---|---|---|
A | 0 | 0.1 |
B | 0 | 0.4 |
C | 1 | 0.35 |
D | 1 | 0.8 |
假設有4條樣本。2個正樣本,2個負樣本,那么\(M*N=4\)。即總共有4個樣本對。分別是:
\((D,B),(D,A),(C,B),(C,A)\)。
在\((D,B)\)樣本對中,正樣本\(D\)預測的概率大於負樣本\(B\)預測的概率(也就是\(D\)的得分比\(B\)高),記為1
同理,對於\((C,B)\)。正樣本\(C\)預測的概率小於負樣本\(C\)預測的概率,記為0.
最后可以算得,總共有3個符合正樣本得分高於負樣本得分,故$$AUC=\frac{1+1+0+1}{4}=0.75$$
當得分(probability)有一樣(0.4)的情況:
ID | label | probability |
---|---|---|
A | 0 | 0.1 |
B | 0 | 0.4 |
C | 1 | 0.4 |
D | 1 | 0.8 |
同樣本是4個樣本對,對於樣本對\((C,B)\)其I值為0.5。
為什么說這個方法暴力呢?
因為,我們需要羅列出所有正例,負例的組合,相當於一個笛卡爾積,如果正例和負例都很多的情況下,那么這個笛卡爾積的集合很大,計算很費時間。
通過觀察可以發現,(D,B),(D,A)統計過程中,由於 \(D\) 的得分很高,我們可以通過一次排序直接數出來比 \(D\)小的有多少個,並不需要全部羅列出來。因此,產生下面的計算方式。
計數統計
ID | label | probability | Rank |
---|---|---|---|
D | 1 | 0.8 | 4 |
B | 0 | 0.4 | 3 |
C | 1 | 0.35 | 2 |
A | 0 | 0.1 | 1 |
按照公式計算:
\(AUC=\frac{4+2-\frac{2(2+1)}{2}}{2\times2}=\frac{3}{4}=0.75\)
與上面計算方法得到的結果一樣,但是我們只需要排序一下,不需要笛卡爾積運算,排序的復雜度是 log 級別的
如果得分有相同的:
ID | label | probability | Rank |
---|---|---|---|
G | 0 | 0.3 | 1 |
F | 1 | 0.5 | 2 |
E | 1 | 0.5 | 3 |
D | 0 | 0.5 | 4 |
C | 0 | 0.5 | 5 |
B | 1 | 0.7 | 6 |
A | 1 | 0.8 | 7 |
這里需要注意的是:相等概率得分的樣本,無論正負,誰在前,誰在后無所謂。
由於只考慮正樣本的rank值:
對於正樣本A,其rank值為7
對於正樣本B,其rank值為6
對於正樣本E,其rank值為(5+4+3+2)/4
對於正樣本F,其rank值為(5+4+3+2)/4
上述公式簡單推導
經過排序后,按照概念我們只需要找出 正例得分大於負例的(正,負)對的數量即可。
首先,排序后最大的rank就是全部樣例的總數。
在所有正例中(P個),
排在第一(No1)的\(D\),統計比他小的所有負例個數,即 \(rank-1-(P-No)=4-1-(2-1)=2\)也就是 \((D,B),(D,A)\)
排在第二(No2)的\(C\), 統計比他小的所有負例個數,\(rank-1-(P-No)=2-1-(2-2)=1\)也就是\((C,A)\)
所以$$AUC=\frac{2+1}{4}=0.75$$
如果用一個公式來表示:
常數項就是一個等差數列
代碼
import numpy as np
from sklearn.metrics import roc_auc_score
y_true = np.array([1, 1, 0, 0, 1, 1, 0])
y_scores = np.array([0.8, 0.7, 0.5, 0.5, 0.5, 0.5, 0.3])
print('y_true', y_true)
print('y_score', y_scores)
print(roc_auc_score(y_true, y_scores))
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print('y_true', y_true)
print('y_score', y_scores)
print(roc_auc_score(y_true, y_scores))