AUC指标深度理解
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(偽陽率)兩個概念:
[TPR=frac{TP}{TP+FN}=frac{TP}{P}
]
[FPR=frac{FP}{FP+TN}=frac{FP}{N}
]
其中,(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。
[AUC=frac{1+1+0.5+1}{4}=0.875
]
為什么說這個方法暴力呢?
因為,我們需要羅列出所有正例,負例的組合,相當于一個笛卡爾積,如果正例和負例都很多的情況下,那么這個笛卡爾積的集合很大,計算很費時間。
通過觀察可以發現,(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 imes2}=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$$
如果用一個公式來表示:
[AUC=frac{sum_{1}^{P}{rank-1-(P-no)}}{P imes N}=frac{sum_{1}^{P}{rank}-(P+(P-1)+(P-2)+...+1)}{P imes N}=frac{sum_{1}^{P}{rank}-frac{P(P+1)}{2}}{P imes N}
]
常數項就是一個等差數列
代碼
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))
參考
https://blog.csdn.net/weixin_37683979/article/details/87882943
https://www.zhihu.com/question/39840928
總結
- 上一篇: 微信小程序开发系列六:微信框架API的调
- 下一篇: ESXi 安装网卡vib驱动文件