ROC曲線 和 AUC 直白詳解
- 2019 年 10 月 30 日
- 筆記
ROC曲線
- 定義
在訊號檢測理論中,接收者操作特徵曲線(receiver operating characteristic curve, 或者叫ROC曲線)是一種坐標圖式的分析工具, 用於 (1) 選擇最佳的訊號偵測模型、捨棄次佳的模型。 (2) 在同一模型中設定最佳閾值。
這裡我們只要記得
ROC曲線
主要是用來確定一個模型的 閾值。 同時在一定程度上也可以衡量這個模型的好壞
- 理解 既然我們想要直白來理解 ROC曲線,那麼例子是肯定少不了的: 假設1:感冒有三種特徵,咳嗽,發燒,流鼻涕。 假設2:如果想確定一個人是否得了感冒, 可以根據三種特徵來打分, 每個特徵可以打 0-1 分。 打分越高, 得感冒概率越高。 假設3:現在你是一個醫生, 有100個病人來看病, 你需要根據這些人的三個感冒特徵給他們打分, 得到如下一組數據
(編號,分數)
: (1,2) (2,2.4) (2,0.4)….(100,3) 假設4:我是一個神醫, 能百分百確定別人是否得了感冒。 然後我看了你的報告, 並給每個數據都給了確定的答案, 其中感冒60人,正常40人, 這一步驟主要是模擬實際生產數據中的真實 lab 值。 所以數據就變成了(編號,是否真感冒,分數)
(1,0,2) (2,1,2.4) (2,0,0.4)…. (100,1,3) 好了,現在問題來了, 你是給每個病人打分了, 也知道分數越高得感冒得概率越高, 但是,到底得沒得感冒卻沒有一個標準, 這個標準就是上面說的 閾值, 所以接下來就是要想辦法確定這個 閾值或者標準了, 那麼我們採用辦法呢? 對於這種 二分類 問題的閾值, 就是我們 ROC 曲線大展身手的時候了。 - ROC 曲線 和 閾值
- 閾值比較小的時候: 如果我們認為打 1 分以上的就是感冒患者, 那麼只要有一點癥狀就可以確診為感冒了, 這時候100個人,確診感冒的可能有 80 人, 但是實際呢? 可能80個人中只有50個是真感冒的。 如下圖:
閾值=1 診斷感冒 診斷正常 合計 真感冒 60 0 60 真正常 20 20 40 合計 80 20 100 我們可以發現被你診斷為 感冒的 患者中, 有 60 個是 真的患者, 還有 20 個 正常 也被你診斷成了 感冒。
- 閾值比較大的時候: 如果我們認為打 2 分以上的才是感冒患者, 這時候100個人, 確診感冒的可能有 20 人, 但是實際呢? 真正感冒的可是60人, 你只確診20個, 如下圖: 閾值=2 診斷感冒 診斷正常 合計 真感冒 20 40 60 真正常 0 40 40 合計 20 80 100 我們可以發現,診斷為感冒的20人,每一個都是真正的患者, 但是同時,一些特徵可能不是很明顯的真正患者也被你誤診為了正常
- 什麼是合適的閾值 我們期望的是閾值不大不小, 換句話理解就是, 我們希望得到一個使得 如果是患者,那就一定要診斷為患者, 而如果你不是患者,我也不能把你誤診成患者, 那麼將這個想法用公式表示出來就是:
這裡我們引入了真陽率 和 假陽率, 其定義如下: 真陽率:預測為真,並且預測正確 占 所有真樣本的 比例 假陽率:預測為真,但是預測錯誤 占 所有非真樣本的 比例 這裡很明顯,我們的 真 就是 患者,非真 就是 正常 人 所以合適的閾值就是:使得 真陽率 趨於 1,並且 假陽率 趨於 0。
- 尋找合適的閾值 所以我們一點點改變閾值, 就可以得到一組又一組的
真陽率 和 假陽率
, 將這一組組真陽率 和 假陽率
在坐標軸上表示出來, 就是我們要的 ROC曲線, 通過圖形化,我們就可以很直觀的看到他們的變化了。 這個圖只是隨便在網上找的, 可不是這個列子的圖噢, 我們大概看下 ROC曲線的 樣子就好了
roc.png 其中 x 軸表示 假陽率,y 軸表示 真陽率, 可以發現 假陽率 和 真陽率 是成正相關的, 也就是說我們其實基本不可能找到一個 閾值, 使得
真陽率=1
而假陽率=0
, 如果出現這種情況, 那麼這個曲線的經過(0,1)點, 這個圖就是一個正方形了。
好了,到這裡我想對 ROC曲線 你應該有一個比較感觀的認識了, 其實這個演算法也是很符合我們的常識的, 也告訴我們,看似高大上的一些演算法, 其實真的就是源於生活的點點滴滴。
這裡再補充一點: 我一直說的都是從 預測為感冒 這個角度來闡述, 這也是二分類的一個好處, 我們只要想明白了一個角度, 另外一個角度就是一個
1 - x
的問題了
AUC
- 定義
- ROC曲線 與 橫軸 圍城的曲邊形的面積
- 將所有樣本根據演算法模型預測的打分進行升序排列, 隨機挑選一正一負兩個樣本, 負樣本排在正樣本前面的概率
只是看文字好像不是很好理解, 可以結合上面那個例子來看一看就好理解了, 我們給所有來看病的人都有打分, 按照打分給他們排個序, 然後隨機挑選一個真得感冒 和 一個 真正常的人, 看一下是不是真正常的人排在前面, 如果是,那麼計數為1, 進行 N 次實驗, 所有計數的累計和 為 n, 那麼
n/N
就是AUC的值了, 順便提一下,最理想的情況就是n = N
了, 也意味著我們的打分已經完美
定義有兩種,但是他們應該如何進行理解互通呢? 筆者目前也不是很清楚,嘗試推理了下, 也不是很明白,這裡就不敢班門弄斧了, 如果有大佬理解,請不吝賜教!!!非常感謝!!! 這裡如果有感謝興趣的朋友,也可以查看下 這篇部落格, 應該是我找到的比較有深度的 auc 的計算了
- 為什麼需要 AUC 前面我們說了 ROC曲線 可以用來給一個模型確定閾值, 那麼 AUC 則是來評判一個 二分類的 模型的優劣。 如果
AUC = 1
:完美預測,基本不會存在的情況。 如果0.5 < AUC < 1
:除了完美預測,那就乘這個區間的最有價值了。 如果AUC = 0.5
:因為是二分類,隨機猜測也就是這個概率了,完全就沒有價值 如果AUC < 0.5
:比隨機猜測的概率還低!!!但是反過來說,非黑即白,如果取個反呢?
總的來說,不考慮最後一種情況, AUC當然是越大 越好, 如果是最後一致情況,那當然是越小越好, 因為我一旦取反,那麼就和第一種情況一樣啦。
這裡還補充一點, 關於我們預測分類為什麼不直接用 準確度,
我們可以想像一下,對於一些有偏的數據, 比如中彩票的概率如果是 萬分之一, 那麼我要預測中沒中彩票, 只要都預測為不中, 那我的準確率不是有 99.99%? 看數據是不是很好,但是實際是不是很廢? 用 ROC 和 AUC 來評判就是可以很好的避免這個問題了, 具體你可以自己算算這個列子的 ROC 曲線就可以理解了。
- AUC 計算 首先還是這篇部落格。 其次,我想說的是,寫AUC的部落格那麼多, 為什麼沒人將工作中的計算方法說上來呢? 所以這裡我就貼一個工作中計算方式: 1.首先我們計算AUC肯定得有一份打完分了的數據,假設數據
auc.text
,內容如下: -1 0.12 -1 0.13 -1 0.16 1 0.2 -1 0.21 -1 0.23 1 0.3 -1 0.32 -1 0.35 1 0.4 -1 0.42 -1 0.46 1 0.5 -1 0.51 -1 0.53 1 0.7 1 1.1 1 1.2 1 1.2- 計算方法
cat auc.text |sort -k2n|awk '($1==-1){++x;a+=y}($1==1){++y}END{print 1.0-a/(x*y)}'
通過一個簡單的 awk 就可以得出來了, 至於這個公式得原理,也很簡單, 就是完全遵循我們定義中的第二種方式得來的, 推理過程就不啰嗦了, 大致解釋下:- x 表示所有負樣本數,y表示 正樣本數
- 所以 x * y 就是對所有正負做一次 AUC 實驗,可以做 x*y 這麼多次
- 因為是排序的,所以每當在 負樣本上面找到一個正樣本, 那麼實驗錯誤的次數就得累計一次
- 所以 y 其實也就記錄了,當前這個負樣本上面 有多少個 正樣本, 那麼就有多少次預測錯誤,
- 所以 a 記錄的就是預測錯誤的值
- 所以 1- (a/x*y) 就是 AUC
- 計算方法
我不知道我解釋的有沒有讓你明白…. 但是我只能說到這裡了…. 好了,本文到此就結束啦!謝謝你的閱讀!!!