模型評價指標:AUC


參考鏈接:https://www.iteye.com/blog/lps-683-2387643

問題:

  • AUC是什么
  • AUC能拿來干什么
  • AUC如何求解(深入理解AUC)

AUC是什么

混淆矩陣(Confusion matrix)

混淆矩陣是理解大多數評價指標的基礎,毫無疑問也是理解AUC的基礎。豐富的資料介紹着混淆矩陣的概念,這里用一個經典圖來解釋混淆矩陣是什么。 
這里寫圖片描述 
顯然,混淆矩陣包含四部分的信息: 
1. True negative(TN),稱為真陰率,表明實際是負樣本預測成負樣本的樣本數 
2. False positive(FP),稱為假陽率,表明實際是負樣本預測成正樣本的樣本數 
3. False negative(FN),稱為假陰率,表明實際是正樣本預測成負樣本的樣本數 
4. True positive(TP),稱為真陽率,表明實際是正樣本預測成正樣本的樣本數

對照着混淆矩陣,很容易就能把關系、概念理清楚,但是久而久之,也很容易忘記概念。不妨我們按照位置前后分為兩部分記憶,前面的部分是True/False表示真假,即代表着預測的正確性,后面的部分是positive/negative表示正負樣本,即代表着預測的結果,所以,混淆矩陣即可表示為正確性-預測結果的集合。現在我們再來看上述四個部分的概念(均代表樣本數,下述省略): 
1. TN,預測是負樣本,預測對了 
2. FP,預測是正樣本,預測錯了 
3. FN,預測是負樣本,預測錯了 
4. TP,預測是正樣本,預測對了

幾乎我所知道的所有評價指標,都是建立在混淆矩陣基礎上的,包括准確率、精准率、召回率、F1-score,當然也包括AUC。

ROC曲線

事實上,要一下子弄清楚什么是AUC並不是那么容易,首先我們要從ROC曲線說起。對於某個二分類分類器來說,輸出結果標簽(0還是1)往往取決於輸出的概率以及預定的概率閾值,比如常見的閾值就是0.5,大於0.5的認為是正樣本,小於0.5的認為是負樣本。如果增大這個閾值,預測錯誤(針對正樣本而言,即指預測是正樣本但是預測錯誤,下同)的概率就會降低但是隨之而來的就是預測正確的概率也降低;如果減小這個閾值,那么預測正確的概率會升高但是同時預測錯誤的概率也會升高。實際上,這種閾值的選取也一定程度上反映了分類器的分類能力。我們當然希望無論選取多大的閾值,分類都能盡可能地正確,也就是希望該分類器的分類能力越強越好,一定程度上可以理解成一種魯棒能力吧。 
為了形象地衡量這種分類能力,ROC曲線橫空出世!如下圖所示,即為一條ROC曲線(該曲線的原始數據第三部分會介紹)。現在關心的是: 
- 橫軸:False Positive Rate(假陽率,FPR) 
- 縱軸:True Positive Rate(真陽率,TPR)

這里寫圖片描述 
- 假陽率,簡單通俗來理解就是預測為正樣本但是預測錯了的可能性,顯然,我們不希望該指標太高。

 

- 真陽率,則是代表預測為正樣本但是預測對了的可能性,當然,我們希望真陽率越高越好。

 

顯然,ROC曲線的橫縱坐標都在[0,1]之間,自然ROC曲線的面積不大於1。現在我們來分析幾個特殊情況,從而更好地掌握ROC曲線的性質: 
- (0,0):假陽率和真陽率都為0,即分類器全部預測成負樣本 
- (0,1):假陽率為0,真陽率為1,全部完美預測正確,happy 
- (1,0):假陽率為1,真陽率為0,全部完美預測錯誤,悲劇 
- (1,1):假陽率和真陽率都為1,即分類器全部預測成正樣本 
- TPR=FPR,斜對角線,預測為正樣本的結果一半是對的,一半是錯的,代表隨機分類器的預測效果

於是,我們可以得到基本的結論:ROC曲線在斜對角線以下,則表示該分類器效果差於隨機分類器,反之,效果好於隨機分類器,當然,我們希望ROC曲線盡量除於斜對角線以上,也就是向左上角(0,1)凸。

AUC(Area under the ROC curve)

ROC曲線一定程度上可以反映分類器的分類效果,但是不夠直觀,我們希望有這么一個指標,如果這個指標越大越好,越小越差,於是,就有了AUC。AUC實際上就是ROC曲線下的面積。AUC直觀地反映了ROC曲線表達的分類能力。 
- AUC = 1,代表完美分類器 
- 0.5 < AUC < 1,優於隨機分類器 
- 0 < AUC < 0.5,差於隨機分類器

AUC能拿來干什么

從作者有限的經歷來說,AUC最大的應用應該就是點擊率預估(CTR)的離線評估。CTR的離線評估在公司的技術流程中占有很重要的地位,一般來說,ABTest和轉全觀察的資源成本比較大,所以,一個合適的離線評價可以節省很多時間、人力、資源成本。那么,為什么AUC可以用來評價CTR呢?我們首先要清楚兩個事情: 
1. CTR是把分類器輸出的概率當做是點擊率的預估值,如業界常用的LR模型,利用sigmoid函數將特征輸入與概率輸出聯系起來,這個輸出的概率就是點擊率的預估值。內容的召回往往是根據CTR的排序而決定的。 
2. AUC量化了ROC曲線表達的分類能力。這種分類能力是與概率、閾值緊密相關的,分類能力越好(AUC越大),那么輸出概率越合理,排序的結果越合理。

我們不僅希望分類器給出是否點擊的分類信息,更需要分類器給出准確的概率值,作為排序的依據。所以,這里的AUC就直觀地反映了CTR的准確性(也就是CTR的排序能力)

AUC如何求解

步驟如下: 
1. 得到結果數據,數據結構為:(輸出概率,標簽真值) 
2. 對結果數據按輸出概率進行分組,得到(輸出概率,該輸出概率下真實正樣本數,該輸出概率下真實負樣本數)。這樣做的好處是方便后面的分組統計、閾值划分統計等 
3. 對結果數據按輸出概率進行從大到小排序 
4. 從大到小,把每一個輸出概率作為分類閾值,統計該分類閾值下的TPR和FPR 
5. 微元法計算ROC曲線面積、繪制ROC曲線

 

代碼如下所示:

import pylab as pl  
from math import log,exp,sqrt  
import itertools  
import operator  
  
def read_file(file_path, accuracy=2):  
    db = []  #(score,nonclk,clk)  
    pos, neg = 0, 0 #正負樣本數量  
    #讀取數據  
    with open(file_path,'r') as fs:  
        for line in fs:  
            temp = eval(line)  
            #精度可控  
            #score = '%.1f' % float(temp[0])  
            score = float(temp[0])  
            trueLabel = int(temp[1])  
            sample = [score, 0, 1] if trueLabel == 1 else [score, 1, 0]  
            score,nonclk,clk = sample  
            pos += clk #正樣本  
            neg += nonclk #負樣本  
            db.append(sample)  
    return db, pos, neg  
  
def get_roc(db, pos, neg):  
    #按照輸出概率,從大到小排序  
    db = sorted(db, key=lambda x:x[0], reverse=True)  
    file=open('data.txt','w')  
    file.write(str(db))  
    file.close()  
    #計算ROC坐標點  
    xy_arr = []  
    tp, fp = 0., 0.  
    for i in range(len(db)):  
        tp += db[i][2]  
        fp += db[i][1]  
        xy_arr.append([fp/neg,tp/pos])  
    return xy_arr  
  
def get_AUC(xy_arr):  
    #計算曲線下面積  
    auc = 0.  
    prev_x = 0  
    for x,y in xy_arr:  
        if x != prev_x:  
            auc += (x - prev_x) * y  
            prev_x = x  
    return auc  
  
def draw_ROC(xy_arr):  
    x = [_v[0] for _v in xy_arr]  
    y = [_v[1] for _v in xy_arr]  
    pl.title("ROC curve of %s (AUC = %.4f)" % ('clk',auc))  
    pl.xlabel("False Positive Rate")  
    pl.ylabel("True Positive Rate")  
    pl.plot(x, y)# use pylab to plot x and y  
    pl.show()# show the plot on the screen  

 

數據:提供的數據為每一個樣本的(預測概率,真實標簽)tuple 

數據鏈接:https://pan.baidu.com/s/1c1FUzVM,密碼1ax8 
計算結果:AUC=0.747925810016,與Spark MLLib中的roc_AUC計算值基本吻合 
當然,選擇的概率精度越低,AUC計算的偏差就越大

總結

  1. ROC曲線反映了分類器的分類能力,結合考慮了分類器輸出概率的准確性
  2. AUC量化了ROC曲線的分類能力,越大分類效果越好,輸出概率越合理
  3. AUC常用作CTR的離線評價,AUC越大,CTR的排序能力越強

參考資料

很多大牛對AUC都有自己的認識和理解,這里圍繞和AUC的意義是什么,給出一些能幫助自己理解AUC的 大牛們的回答 
[1]From 機器學習和統計里面的auc怎么理解?

這里寫圖片描述

[2]From 機器學習和統計里面的auc怎么理解?

這里寫圖片描述

[3]From 精確率、召回率、F1 值、ROC、AUC 各自的優缺點是什么?

這里寫圖片描述

[4]From 多高的AUC才算高?

這里寫圖片描述

其他一些參考資料: 
利用Python畫ROC曲線和AUC值計算 
精確率與召回率,RoC曲線與PR曲線 
ROC和AUC介紹以及如何計算AUC 
基於混淆矩陣的評價指標 
機器學習性能評估指標


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM