二分類評估,從混淆矩陣說起
在《理解交叉驗證》一文中,我們談到了使用 AUC 來對比不同模型的好壞,那麼 AUC 是什麼?它是如何衡量一個模型的好壞的呢?除了 AUC 以外,還有其他評估手段嗎?本文我們就來探討下這幾個問題。
混淆矩陣
要了解 AUC,我們需要從另外一個概念——混淆矩陣(Confusion Matrix)說起,混淆矩陣是一個 2 維方陣,它主要用於評估二分類問題(例如:預測患或未患心臟病、股票漲或跌等這種只有兩類情況的問題)的好壞。你可能會問多分類問題怎麼辦?實際上,多分類問題依然可以轉換為二分類問題進行處理。下圖是一個用於評判是否患有心臟病的混淆矩陣:
縱向看混淆矩陣,它體現了真實情況下,患病和未患病的人數,上圖中,真實患心臟病的人數為 True Positive + False Negative,未患心臟病的人數為 False Positive + True Negative;類似的,橫向看混淆矩陣,它體現了模型預測出來患心臟病的人數為 True Positive + False Positive,而預測未患心臟病的人數為 False Negative + True Negative。
兩個方向一起看,預測患病且實際也患病,我們稱它為真陽性 (True Positive),預測未患病且實際也未患病,被稱為真陰性 (True Negative),這兩個區域是模型預測正確的部分;模型預測錯誤也分兩種情況,假陽性 (False Positive) 表示預測患病,但實際卻未患病,假陰性 (False Negative) 表示預測未患病,但實際卻患了病的情況。
概念有點多,但並不難記,可以看到,這些名詞都是圍繞著預測來命名的——預測患病時被稱為「True/False Positive」,預測未患病時被稱為 「True/False Negative」。
上圖中,模型預測正確的部分用綠色填充,它所佔的比例又被稱為準確率 (Accuracy):
單靠準確率這一項,並不足以評估模型的好壞,例如下面這種情況,雖然準確率可以達到 80%,但在實際患病的人群中,該模型的預測成功率只有 50%,很明顯它不是一個好模型。
患心臟病 | 未患心臟病 | |
---|---|---|
患心臟病 | 10 | 10 |
未患心臟病 | 10 | 70 |
Sensitivity 和 Specificity
所以,我們需要引入更多的衡量指標,Sensitivity (或 Recall) 表示實際患者中,預測患病成功的概率,同時 Sensitivity 這個詞也有"過敏"的意思,和患病對應,這樣關聯起來比較好記:
既然有衡量患病(正樣例)的指標,那肯定也有衡量未患病(負樣例)的指標,Specificity 就是用來表示實際未患病的人群中,預測未患病成功的概率,即
Specificity 這個詞有"免疫"的意思,能和未患病相關聯,所以也很好記。
這兩個指標的出現,能更好的幫你比較模型間的差異,並在其中做出取捨。例如當兩個模型的 Accuracy 相近時,如果你更看重於預測患病的效果,你應該選 Sensitivity 值較高的;相反,如果你更看重於預測未患病的效果,你就應該選擇 Specificity 較高的。
ROC 曲線、AUC 和 F1 Score
更進一步,我們還可以通過將這些指標圖形化,以獲得更直觀的評估結果,ROC (Receiver Operating Characteristic) 曲線就是其中常用的一種。
我們知道,分類模型(例如"邏輯迴歸”)的結果是一個大於 0 且小於 1 的概率,此時我們還需要一個閾值,才能界定是否患病,通常我們把閾值設為 0.5,這樣當結果大於 0.5 時可判定為患病,否則判定為未患病。
而閾值可以取 0 到 1 之間的任意一個值,對每一個閾值,都有一個混淆矩陣與之對應,有了混淆矩陣,我們就可以求出一對 Sensitivity 和 Specificity,通過這兩個數,我們就可以在一個以 1-Specificity 為橫座標,Sensitivity 為縱座標的座標系上畫一個點,把所有可能的閾值所產出的點連起來,就是 ROC 曲線。
下面我們來看一個具體的例子,假設我們對老鼠做研究,希望通過老鼠的體重來預測其患心臟病的概率,我們採用邏輯迴歸演算法來建模,下圖是預測結果,圖中有 10 個老鼠樣本點,其中紅色點代表實際健康的老鼠,藍色點代表實際患病的老鼠,這些點用一條邏輯迴歸曲線擬合,圖中還有一條 P=0.5 的直線用來表示閾值為 0.5,可以看出,高於 P=0.5 的 5 只老鼠被預測為患病,而其他 5 只老鼠被預測為健康,預測成功率(Accuracy)為 80%:
下面我們通過以上資料,來畫一條 ROC 曲線。首先取閾值為 1,此時所有的老鼠都被預測為未患病,根據樣本真實患病情況,我們可以得到如下混淆矩陣
根據上述混淆矩陣,我們就可以算出一組 Sensitivity 和 Specificity 的值。接著我們不斷調整閾值,以獲得所有的 Sensitivity 和 Specificity 對,因為這裡我們的樣本點較少,所以讓閾值根據樣本點來取樣即可,依然用橫線表示閾值,則所有閾值的取樣情況如下:
我們把這些閾值對應的混淆矩陣都列出來:
然後,計算這些混淆矩陣對應的 Sensitivity 和 1-Specificity:
Threshold | Sensitivity | 1- Specificity |
---|---|---|
1 | 0 | 0 |
0.99 | 0.2 | 0 |
0.97 | 0.4 | 0 |
0.94 | 0.4 | 0.2 |
0.90 | 0.6 | 0.2 |
0.71 | 0.8 | 0.2 |
0.09 | 0.8 | 0.4 |
0.043 | 1.0 | 0.4 |
0.0061 | 1.0 | 0.6 |
0.0003 | 1.0 | 0.8 |
0 | 1.0 | 1.0 |
根據該表格,以 1-Specificity 為橫軸,Sensitivity 為縱軸作圖,通常,在畫 ROC 曲線時,我們把 1-Specificity 對應的座標軸記為 FPR (False Positive Rate),把 Sensitivity 對應的座標軸記為 TPR (True Positive Rate),如下:
ROC 曲線有以下特點:
- 從 (0, 0) 點到 (1,1) 點的對角線上的每個點,意味著在患者中,預測患病成功的概率(TPR),與未患病者中,預測未患病失敗的概率(FPR)相等,對於模型來說,TPR 越大越好,FPR 越小越好,所以我們需要儘可能的使 ROC 曲線沿左上角方向遠離該對角線。
- ROC 曲線還可以幫助我們選擇合適的閾值,即 TPR 相同的情況下,ROC 上的點越靠左,效果越好,因為越靠左,意味著 FPR 越小。
根據 ROC 曲線的第 1 個特點:「曲線越靠近左上角,模型的效果越好」,意味著一個更好模型,其曲線下方的面積更大,我們把 ROC 曲線下方的面積稱為 AUC (Area Under Curve),有了這個概念後,只需一個數值就可以衡量模型的好壞了,上面示例模型的 AUC 如下:
通常情況下我們都使用 AUC 來評估模型,既然是”通常”,那肯定就有例外:當患病率 (或正樣本佔比) 非常小時,Ture Negative 就會非常大,這個值就會使影響 FPR,使 FPR 較小,為了避免這種影響,我們可以將 FPR 用另一個指標代替:Precision
Precision 的含義是預測患病的樣本中,實際也患病的比例;這樣,將 Precision 和 Sensitivity 結合起來,會讓我們更專注於患病 (正樣本) 的預測效果,而機器學習中的另一個效果指標: F1 Score ,就是專門負責這件事兒的
上面的公式中,Recall 等價於 Sensitivity,和 AUC 一樣,兩個模型互相比較,F1 Score 越大者,預測效果越好,而且 F1 Score 能更好的衡量正樣本的預測效果。
總結
本文通過一個醫學例子——是否患心臟病——來講述什麼是混淆矩陣、ROC 曲線、AUC 及 F1 Score,其中,我們還一起學習了 ROC 曲線是如何畫出來的,最後,我們還談到了 AUC 和 F1 Score 以及它們之間細微的差別。
需要注意的是,二分類評估並不限於對患病及未患病這兩種情況的分類,考慮到通用性,你完全可以將本文中的患心臟病替換為正樣本、把未患心臟病替換為負樣本。