腳注:以下內容僅是閒暇時遇到問題的總結,便於日後檢視。如有不對地方,還請及時指正。
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
eri
−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 是乙個模型的評價指標,用於分類任務。那麼這個指標代表什麼呢?這個指標想表達的含義,簡單來說其實就是隨機抽出一對樣本 乙個正樣本,乙個負樣本 然後用訓練得到的分類器來對這兩個樣本進行 得到正樣本的概率大於負樣本概率的概率。參考方法一 定義計算 計算面...