【基礎】模型評估指標 AUC 和 ROC,這是我看到的最透徹的講解

  • 2019 年 10 月 7 日
  • 筆記

閱讀大概需要9分鐘

跟隨小部落客,每天進步一丟丟

作者:Webbley

編輯:zglg

來自:Python與演算法社區

blog.csdn.net/liweibin1994/article/details/79462554

AUC在機器學習領域中是一種模型評估指標。根據維基百科的定義,AUC(area under the curve)是ROC曲線下的面積。所以,在理解AUC之前,要先了解ROC是什麼。而ROC的計算又需要藉助混淆矩陣,因此,我們先從混淆矩陣開始談起。

混淆矩陣

假設,我們有一個任務:給定一些患者的樣本,構建一個模型來預測腫瘤是不是惡性的。在這裡,腫瘤要麼良性,要麼惡性,所以這是一個典型的二分類問題。

假設我們用y=1表示腫瘤是良性,y=0表示腫瘤是惡性。則我們可以製作如下圖的表格:

如上圖,TP表示預測為良性,而實際也是良性的樣例數;

FN表示預測為惡性,而實際是良性的樣例數;

FP表示預測為良性,而實際是惡性的樣例數;

TN表示預測為惡性,而實際也是惡性的樣例數;

所以,上面這四個數就形成了一個矩陣,稱為混淆矩陣。

那麼接下來,我們如何利用混淆矩陣來計算ROC呢?

首先我們需要定義下面兩個變數:

TPR表示,在所有良性腫瘤中,被預測為良性的比例。稱為真陽性率。真陽性率告訴我們,隨機拿一個良性的腫瘤樣本時,有多大的概率會將其預測為良性腫瘤。顯然我們會希望TPR越大越好。

如果以FPR為橫坐標,TPR為縱坐標,就可以得到下面的坐標系:

可能看到這裡,你會覺得有點奇怪,用FPR和TPR分別作橫縱坐標有什麼用呢?我們先來考察幾個特殊的點。

點(0,1),即FPR=0,TPR=1。FPR=0說明FP=0,也就是說,沒有假正例。TPR=1說明,FN=0,也就是說沒有假反例。這不就是最完美的情況嗎?所有的預測都正確了。良性的腫瘤都預測為良性,惡性腫瘤都預測為惡性,分類百分之百正確。這也體現了FPR 與TPR的意義。就像前面說的我們本來就希望FPR越小越好,TPR越大越好。

點(1,0),即FPR=1,TPR=0。這個點與上面那個點形成對比,剛好相反。所以這是最糟糕的情況。所有的預測都預測錯了。

點(0,0),即FPR=0,TPR=0。也就是FP=0,TP=0。所以這個點的意義是所有的樣本都預測為惡性腫瘤。也就是說,無論給什麼樣本給我,我都無腦預測成惡性腫瘤就是了。

點(1,1),即FPR=1,TPR=1。顯然,這個點跟點(0,0)是相反的,這個點的意義是將所有的樣本都預測為良性腫瘤。

考察完這四個點,我們可以知道,如果一個點越接近左上角,那麼說明模型的預測效果越好。如果能達到左上角(點(0,1)),那就是最完美的結果了。

ROC曲線

介紹了混淆矩陣之後,我們就可以了解一下ROC(receiver operating characteristic curve)曲線是怎麼定義的。

我們知道,在二分類(0,1)的模型中,一般我們最後的輸出是一個概率值,表示結果是1的概率。那麼我們最後怎麼決定輸入的x是屬於0或1呢?我們需要一個閾值,超過這個閾值則歸類為1,低於這個閾值就歸類為0。所以,不同的閾值會導致分類的結果不同,也就是混淆矩陣不一樣了,FPR和TPR也就不一樣了。所以當閾值從0開始慢慢移動到1的過程,就會形成很多對(FPR, TPR)的值,將它們畫在坐標繫上,就是所謂的ROC曲線了。

我們來舉一個例子。比如我們有5個樣本:

真實的類別(label)為y = c(1,1,0,0,1).

一個分類器預測樣本為1的概率為p=c(0.5, 0.6, 0.55, 0.4, 0.7).

正如上面說的,我們需要有閾值,才能將概率轉換為類別,才能得到FPR和TPR。而選定不同的閾值會得到不同的FPR和TPR。假設我們現在選定的閾值為0.1,那麼5個樣本都被歸類為1。如果選定0.3,結果仍然一樣。如果選了0.45作為閾值,那麼只有樣本4被分進0,其餘都進入1類。當我們不斷改變閾值,就會得到不同的FPR和TPR。然後我們將得到的(FPR , TPR)連接起來,就得到了ROC曲線了。

看到這裡,也許我們還有一點難理解。這裡要注意:

1 閾值的範圍是[0,1],當閾值從1到0慢慢移動時,FPR會越來越大。因為FP(假正例)會越來越多。

2 如果在給定的樣本中,我都隨機預測,也就是0.5概率預測為良性腫瘤,0.5概率預測為惡性腫瘤。那麼這條曲線會是怎樣的呢?可以想像,如果數據是均勻,那麼這條曲線就是y=x。

3 注意曲線一定是從(0,0)開始最終到達(1,1)的。理解了上面四個點的意義就知道了。

4 事實上,ROC曲線不是光滑的,而是階梯型的。為什麼呢?因為樣本的數量是有限的,而FPR和TPR的變化需要至少有一個樣本變化了,在沒有變化的間隙里,就不會有變化。也就是說,步進是1/樣本數。

得到了ROC曲線,我們就可以計算曲線下方的面積了。計算出來的面積就是AUC值了。

AUC值的意義

知道了如何計算AUC值,我們當然是要來問一下AUC值的意義了。為什麼我們要這麼大費周章地搞出這個AUC值?

假設我們有一個分類器,輸出是樣本輸入正例的概率,所有的樣本都會有一個相應的概率,這樣我們可以得到下面這個圖:

其中,橫軸表示預測為正例的概率,縱軸表示樣本數。

所以,藍色區域表示所有負例樣本的概率分布,紅色樣本表示所有正例樣本的概率分布。顯然,如果我們希望分類效果最好的話,那麼紅色區域越接近1越好,藍色區域越接近0越好。

為了驗證你的分類器的效果。你需要選擇一個閾值,比這個閾值大的預測為正例,比這個閾值小的預測為負例。如下圖:

在這個圖中,閾值選擇了0.5於是左邊的樣本都被認為是負例,右邊的樣本都被認為是正例。可以看到,紅色區域與藍色區域是有重疊的,所以當閾值為0.5的時候,我們可以計算出準確率為90%.

好,現在我們來引入ROC曲線。

圖中左上角就是ROC曲線,其中橫軸就是前面說的FPR(False Positive Rate),縱軸就是TPR(True Positive Rate)。

然後我們選擇不同的閾值時,就可以對應坐標系中一個點。

當閾值為0.8時,對應上圖箭頭所指的點。

當閾值為0.5時,對應上圖箭頭所指的點。

這樣,不同的閾值對應不同的點。最後所有的點就可以連在一起形成一條曲線,就是ROC曲線。

現在我們來看看,如果藍色區域與紅色的區域發生變化,那麼ROC曲線會怎麼變呢?

上圖中,藍色區域與紅色區域的重疊部分不多,所以可以看到ROC曲線距離左上角很近。

但是,當藍色區域與紅色區域基本重疊時,ROC曲線就和接近y=x這條線了。

綜上兩個圖,如果我們想要用ROC來評估分類器的分類品質,我們就可以通過計算AUC(ROC曲線下的面積)來評估了,這就是AUC的目的。

其實,AUC表示的是正例排在負例前面的概率。

比如上圖,第一個坐標系的AUC值表示,所有的正例都排在負例的前面。第二個AUC值,表示有百分之八十的正例排在負例的前面。

我們知道閾值可以取不同,也就是說,分類的結果會受到閾值的影響。如果使用AUC的話,因為閾值變動考慮到了,所以評估的效果更好。

另一個好處是,ROC曲線有一個很好的特性:當測試集中的正負樣本分布發生變化了,ROC曲線可以保持不變。在實際的數據集中經常會出現類不平衡(class imbalance)現象,即負樣本比正樣本多很多(或者相反),而且測試數據中的正負樣本的分布也可能隨著時間變化。

在上圖中,(a)和(c)為ROC曲線,(b)和(d)為Precision-Recall曲線。(a)和(b)展示的是分類其在原始測試集(正負樣本分布平衡)的結果,(c)和(d)是將測試集中負樣本的數量增加到原來的10倍後,分類器的結果。可以明顯的看出,ROC曲線基本保持原貌,而Precision-Recall曲線則變化較大。

參考:

https://www.zybuluo.com/frank-shaw/note/152851

https://www.zhihu.com/question/39840928?from=profile_question_card

http://blog.csdn.net/cherrylvlei/article/details/52958720

http://www.dataschool.io/roc-curves-and-auc-explained/

Python方向有很多:機器學習、深度學習,python,情感分析、意見挖掘、句法分析、機器翻譯、人機對話、知識圖譜、語音識別等。