AUC的计算方法
摘要:
在機器學習的分類任務(wù)中,我們常用許多的指標,諸如召回率(Recall)、準確率(Precision)、F1值、AUC等。 那么,如果手動計算AUC應(yīng)該要怎么計算呢?相信大家很多時候都是用寫好的庫直接計算,可能對AUC計算不太了解,下面這篇文章就簡單的概述一下AUC的計算方法。 (注:本文的重點其實不在于闡述什么是AUC。因為網(wǎng)上關(guān)于這方面的文章實在太多了。但是對于AUC的計算的文章相對來說少一些)1.什么是AUC?
相信這個問題很多玩家都已經(jīng)明白了,簡單的概括一下,AUC(are under curve)是一個模型的評價指標,用于分類任務(wù)。 那么這個指標代表什么呢?這個指標想表達的含義,簡單來說其實就是隨機抽出一對樣本(一個正樣本,一個負樣本),然后用訓練得到的分類器來對這兩個樣本進行預(yù)測,預(yù)測得到正樣本的概率大于負樣本概率的概率。具體關(guān)于AUC含義的分析推薦以下回答:
AUC如何理解?
2.如何計算AUC?
計算AUC時,推薦2個方法。 方法一: 在有M個正樣本,N個負樣本的數(shù)據(jù)集里。一共有M*N對樣本(一對樣本即,一個正樣本與一個負樣本)。統(tǒng)計這M*N對樣本里,正樣本的預(yù)測概率大于負樣本的預(yù)測概率的個數(shù)。 ,其中,這樣說可能有點抽象,我舉一個例子便能夠明白。
| ID | label | pro |
| A | 0 | 0.1 |
| B | 0 | 0.4 |
| C | 1 | 0.35 |
| D | 1 | 0.8 |
在這個案例里,沒有出現(xiàn)得分一致的情況,假如出現(xiàn)得分一致的時候,例如:
| ID | label | pro |
| A | 0 | 0.1 |
| B | 0 | 0.4 |
| C | 1 | 0.4 |
| D | 1 | 0.8 |
同樣本是4個樣本對,對于樣本對(C,B)其I值為0.5。 最后的AUC為
方法二: 另外一個方法就是利用下面的公式:
這個公式看起來有點嚇人,首先解釋一下每一個符號的意思: 公式的含義見:公式解釋
,代表第i條樣本的序號。(概率得分從小到大排,排在第rank個位置)
分別是正樣本的個數(shù)和負樣本的個數(shù)
只把正樣本的序號加起來。
同樣本地,我們用上面的例子。
| ID | label | pro |
| A | 0 | 0.1 |
| B | 0 | 0.4 |
| C | 1 | 0.35 |
| D | 1 | 0.8 |
| ID | label | pro | rank |
| A | 0 | 0.1 | 1 |
| C | 1 | 0.35 | 2 |
| B | 0 | 0.4 | 3 |
| D | 1 | 0.8 | 4 |
按照上面的公式,只把正樣本的序號加起來也就是只把樣本C,D的rank值加起來后減去一個常數(shù)項
即:,這個答案和我們上面所計算的是一樣的。
這個時候,我們有個問題,假如出現(xiàn)得分一致的情況怎么辦?下面舉一個例子說明:
| ID | label | pro |
| A | 1 | 0.8 |
| B | 1 | 0.7 |
| C | 0 | 0.5 |
| D | 0 | 0.5 |
| E | 1 | 0.5 |
| F | 1 | 0.5 |
| G | 0 | 0.3 |
在這個例子中,我們有4個取值概率為0.5,而且既有正樣本也有負樣本的情況。計算的時候,其實原則就是相等得分的rank取平均值。具體來說如下: 先排序:
| ID | label | pro | 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
最后我們得到:
3.最后的最后,如何用程序驗證?
為了方便,我們使用sk-learn里面自帶的庫來簡單的驗證一下我們的例子。其python的代碼
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 is ",y_true print "y_scores is ",y_scores print "AUC is",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 is ",y_true print "y_scores is ",y_scores print "AUC is ",roc_auc_score(y_true, y_scores)
總結(jié)
- 上一篇: 阿里云轻量服务器使用
- 下一篇: python完成‘21点游戏’