AUC計算及為何不受樣例不均衡的影響

2021-10-10 13:34:40 字數 3447 閱讀 2698

腳注:以下內容僅是閒暇時遇到問題的總結,便於日後檢視。如有不對地方,還請及時指正。

auc(area under curve)主要作用是衡量學習器優劣的一種效能指標,其被定義為roc曲線下與座標軸圍成的面積。

那這裡為什麼不用roc曲線直接作為衡量學習器優劣的指標呢?其實是因為很多時候roc曲線並不能清晰的說明哪個分類器的效果更好(因為它只是個曲線,不易拿來對比),而auc作為乙個數值,數值越大代表分類器效果越好,易量化。

roc曲線全稱為受試者工作特徵曲線 (receiver operating characteristic curve),它是根據一系列不同的二分類方式(分界值或決定閾),以真陽性率(tpr)為縱座標,假陽性率(fpr)為橫座標繪製的曲線。

(1)名詞定義

(2)幾何解釋

roc曲線的形成,就是將確定正負樣例標籤的閾值α

\alpha

α從0->1按照一定步長取一遍,分別在每個閾值點上計算出(tpr, fpr),進而可形成一條曲線。這裡其實就暗示了後面計算auc的一種方式,幾何方式求曲線下的面積。

如上圖可以看到,我們的理想點(0,1)。如果這條曲線往理想點靠近,即曲線彎曲成都是要往左上角靠近的,它的曲線下面積越大。

思考: 理想狀態點出現,即意味著我們學習器中所有正樣本**分 > 負樣本**分,當閾值α∈(

max(

負樣本得

分),m

in(正

樣本得分

))\alpha \in (max(負樣本得分), min(正樣本得分))

α∈(max

(負樣本

得分),

min(

正樣本得

分)),曲線必然可以抵達理想點;換句話說,只要當我們**出來

m er

it=#

merit = \#\

merit=

#merit數值越大,越是表明當前獲得的學習器效果好.

因為auc計算方法目前主要看到有三種,下面主要是摘抄常用的兩種方法:

(1) 方法一 :直接計算pair對

首先用學習器**出每個樣本的分類**分pi^

\hat

pi​^

​, 對

\, i=1,2,3,\dots,n\}

公升序排列,獲得其對應排序分為:

\備註:n=m

+n,其

中m為正

樣本個數

,n為負

樣本個數

.n = m + n, 其中m為正樣本個數,n為負樣本個數.

n=m+n,

其中m為

正樣本個

數,n為

負樣本個

數.則:a uc

=σsa

mple

i∈po

siti

vesa

mple

ri−m

∗(m+

1)2m

∗nauc = \fracr_i - \frac}

auc=m∗

nσsa

mple

i​∈p

osit

ives

ampl

e​ri

​−2m

∗(m+

1)​​

備註:這裡的計算方法其實就是在計算上述所說的merit數值大小.

(2) 方法二 :求roc曲線下的面積

首先,這段**較好的是減少了一次排序,試想如果資料量非常大的時候,排序是非常耗時的方式,這是個比較精妙的地方。

其次,這裡的bucket_size可以設計的足夠大,回想大學學積分那會,我們總希望梯形分割越多越好,越是能逼近真實曲線下的面積(上限為樣本數,再大無意)。

最後,為什麼計算梯形面積是從bucket號從大到小?其實這樣才能使得我們計算的梯形面積是從橫軸的左向右。回頭看一下上面手稿圖,我們的(0,0)點實際上是thr

eadh

old=

1threadhold=1

thread

hold

=1, 也即閾值是非常大的,而編碼序號大的bucket意味著高threashold。

附上指令碼如下:

def cal_auc(label_list, p_list, bucket_size):

bucket_list = {}

for idx, pi in enumerate(p_list):

if bucket_list.get(int(pi*bucket_size), {}) == {}:

bucket_list[int(pi*bucket_size)] = {}

bucket_list[int(pi*bucket_size)][0] = 1-label_list[idx]

bucket_list[int(pi*bucket_size)][1] = label_list[idx]

else:

bucket_list[int(pi*bucket_size)][label_list[idx]] += 1

area = 0

fp = 0

tp = 0

for i in range(bucket_size , -1, -1):

if bucket_list.get(i,{})=={}:

continue

newfp = fp + bucket_list[i][0]

newtp = tp + bucket_list[i][1]

area += (newfp -fp) * (tp + newtp) / 2.0

fp = newfp

tp = newtp

auc = area / ( fp * tp )

return " ".join(["%s"%auc, "%s"%( tp + fp) ])

在很多排序場景下,尤其是當前許多資料集正負樣例都不太均衡;或者說因訓練集過大,可能會對資料進行負取樣等操作。這擦操作的前提是建立在auc值不會受到正負樣本比例的影響。看過很多部落格也都在討論:為什麼auc不會受正負樣例不平衡的影響?為什麼排序喜歡選擇auc作為評判指標。

一方面,從auc定義來解釋,它是比較「正樣本**分 & 負樣本預分」數值相對大小關係。如若資料比例不同,模型**分**值絕對大小會因此而改變,但是相同分類器對於正負樣本的區分能力是一定的。

另一方面,有人拿出實踐證明:不取樣資料集( 不對負樣本取樣),對比進行負取樣資料集。計算出來的auc不同,發現負樣本越多(即不取樣)的資料集auc數值越高。

下面我們對乙個random分類器,從auc計算公式角度推導下:auc是否受樣本不均衡影響。

從上面的推導來看的話,貌似不管是正負樣本比例是多少,確實好像不會影響到auc的變化。那麼討論區童鞋說到的為什麼負樣本增多,auc還變好了呢?

AUC及TensorFlow AUC計算相關

最近在打天池的比賽,裡面需要用auc來評測模型的效能,所以這裡介紹一下auc的相關概念,並介紹tensorflow含有的函式來計算auc。先介紹一些前置的概念。在乙個二分類問題中,如果本身是正例 positive 正確也 成正例,則稱為真正例 true positive 簡稱tp,而 錯誤 成了反例...

AUC如何計算

auc area under curve 是機器學習二分類模型中非常常用的評估指標,相比於f1 score對專案的不平衡有更大的容忍性,目前常見的機器學習庫中 比如scikit learn 一般也都是整合該指標的計算,但是有時候模型是單獨的或者自己編寫的,此時想要評估訓練模型的好壞就得自己搞乙個au...

AUC及其計算

含義理解二 auc are under curve 是乙個模型的評價指標,用於分類任務。那麼這個指標代表什麼呢?這個指標想表達的含義,簡單來說其實就是隨機抽出一對樣本 乙個正樣本,乙個負樣本 然後用訓練得到的分類器來對這兩個樣本進行 得到正樣本的概率大於負樣本概率的概率。參考方法一 定義計算 計算面...