模型評價(一) AUC大法

問題:

  • AUC是什麼
  • AUC能拿來幹什麼
  • AUC如何求解(深刻理解AUC)

AUC是什麼

混淆矩陣(Confusion matrix)

混淆矩陣是理解大多數評價指標的基礎,毫無疑問也是理解AUC的基礎。豐富的資料介紹着混淆矩陣的概念,這裏用一個經典圖來解釋混淆矩陣是什麼。
這裏寫圖片描述
顯然,混淆矩陣包含四部分的信息:html

  1. True negative(TN),稱爲真陰率,代表實際是負樣本預測成負樣本的樣本數
  2. False positive(FP),稱爲假陽率,代表實際是負樣本預測成正樣本的樣本數
  3. False negative(FN),稱爲假陰率,代表實際是正樣本預測成負樣本的樣本數
  4. True positive(TP),稱爲真陽率,代表實際是正樣本預測成正樣本的樣本數

對照着混淆矩陣,很容易就能把關係、概念理清楚,可是長此以往,也很容易忘記概念。不妨咱們按照位置先後分爲兩部分記憶,前面的部分是True/False表示真假,即表明着預測的正確性,後面的部分是positive/negative表示正負樣本,即表明着預測的結果,因此,混淆矩陣便可表示爲正確性-預測結果的集合。如今咱們再來看上述四個部分的概念(均表明樣本數,下述省略):python

  1. TN,預測是負樣本,預測對了
  2. FP,預測是正樣本,預測錯了
  3. FN,預測是負樣本,預測錯了
  4. TP,預測是正樣本,預測對了

幾乎我所知道的全部評價指標,都是創建在混淆矩陣基礎上的,包括準確率、精準率、召回率、F1-score,固然也包括AUC。git

ROC曲線

事實上,要一會兒弄清楚什麼是AUC並非那麼容易,首先咱們要從ROC曲線提及。對於某個二分類分類器來講,輸出結果標籤(0仍是1)每每取決於輸出的機率以及預約的機率閾值,好比常見的閾值就是0.5,大於0.5的認爲是正樣本,小於0.5的認爲是負樣本。若是增大這個閾值,預測錯誤(針對正樣本而言,即指預測是正樣本可是預測錯誤,下同)的機率就會下降可是隨之而來的就是預測正確的機率也下降;若是減少這個閾值,那麼預測正確的機率會升高可是同時預測錯誤的機率也會升高。實際上,這種閾值的選取也必定程度上反映了分類器的分類能力。咱們固然但願不管選取多大的閾值,分類都能儘量地正確,也就是但願該分類器的分類能力越強越好,必定程度上能夠理解成一種魯棒能力吧。
爲了形象地衡量這種分類能力,ROC曲線橫空出世!以下圖所示,即爲一條ROC曲線(該曲線的原始數據第三部分會介紹)。如今關心的是:github

  • 橫軸:False Positive Rate(假陽率,FPR)
  • 縱軸:True Positive Rate(真陽率,TPR)

這裏寫圖片描述

  • 假陽率,簡單通俗來理解就是預測爲正樣本可是預測錯了的可能性,顯然,咱們不但願該指標過高。
    $$FPR=\frac{FP}{TN+FP}$$
  • 真陽率,則是表明預測爲正樣本可是預測對了的可能性,固然,咱們但願真陽率越高越好。
    $$TPR=\frac{TP}{TP+FN}$$

顯然,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)凸。app

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
基於混淆矩陣的評價指標
機器學習性能評估指標

相關文章
相關標籤/搜索