二分類評估,從混淆矩陣提及

《理解交叉驗證》一文中,咱們談到了使用 AUC 來對比不一樣模型的好壞,那麼 AUC 是什麼?它是如何衡量一個模型的好壞的呢?除了 AUC 之外,還有其餘評估手段嗎?本文咱們就來探討下這幾個問題。算法

混淆矩陣

要了解 AUC,咱們須要從另一個概念——混淆矩陣(Confusion Matrix)提及,混淆矩陣是一個 2 維方陣,它主要用於評估二分類問題(例如:預測患或未患心臟病、股票漲或跌等這種只有兩類狀況的問題)的好壞。你可能會問多分類問題怎麼辦?實際上,多分類問題依然能夠轉換爲二分類問題進行處理。下圖是一個用於評判是否患有心臟病的混淆矩陣:機器學習

cm1

縱向看混淆矩陣,它體現了真實狀況下,患病和未患病的人數,上圖中,真實患心臟病的人數爲 True Positive + False Negative,未患心臟病的人數爲 False Positive + True Negative;相似的,橫向看混淆矩陣,它體現了模型預測出來患心臟病的人數爲 True Positive + False Positive,而預測未患心臟病的人數爲 False Negative + True Negative。post

兩個方向一塊兒看,預測患病且實際也患病,咱們稱它爲真陽性 (True Positive),預測未患病且實際也未患病,被稱爲真陰性 (True Negative),這兩個區域是模型預測正確的部分;模型預測錯誤也分兩種狀況,假陽性 (False Positive) 表示預測患病,但實際卻未患病,假陰性 (False Negative) 表示預測未患病,但實際卻患了病的狀況。學習

概念有點多,但並不難記,能夠看到,這些名詞都是圍繞着預測來命名的——預測患病時被稱爲「True/False Positive」,預測未患病時被稱爲 「True/False Negative」。cdn

上圖中,模型預測正確的部分用綠色填充,它所佔的比例又被稱爲準確率 (Accuracy):blog

Accuracy = \frac {TP + TN} {TP + TN + FP + FN}

單靠準確率這一項,並不足以評估模型的好壞,例以下面這種狀況,雖然準確率能夠達到 80%,但在實際患病的人羣中,該模型的預測成功率只有 50%,很明顯它不是一個好模型。ci

患心臟病 未患心臟病
患心臟病 10 10
未患心臟病 10 70

Sensitivity 和 Specificity

因此,咱們須要引入更多的衡量指標,Sensitivity (或 Recall) 表示實際患者中,預測患病成功的機率,同時 Sensitivity 這個詞也有"過敏"的意思,和患病對應,這樣關聯起來比較好記:get

Sensitivity = \frac{TP}{TP+FN}

既然有衡量患病(正樣例)的指標,那確定也有衡量未患病(負樣例)的指標,Specificity 就是用來表示實際未患病的人羣中,預測未患病成功的機率,即it

Specificity = \frac{TN}{TN+FP}

Specificity 這個詞有"免疫"的意思,能和未患病相關聯,因此也很好記。io

這兩個指標的出現,能更好的幫你比較模型間的差別,並在其中作出取捨。例如當兩個模型的 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 曲線有如下特色:

  1. 從 (0, 0) 點到 (1,1) 點的對角線上的每一個點,意味着在患者中,預測患病成功的機率(TPR),與未患病者中,預測未患病失敗的機率(FPR)相等,對於模型來講,TPR 越大越好,FPR 越小越好,因此咱們須要儘量的使 ROC 曲線沿左上角方向遠離該對角線。
  2. ROC 曲線還能夠幫助咱們選擇合適的閾值,即 TPR 相同的狀況下,ROC 上的點越靠左,效果越好,由於越靠左,意味着 FPR 越小。

根據 ROC 曲線的第 1 個特色:「曲線越靠近左上角,模型的效果越好」,意味着一個更好模型,其曲線下方的面積更大,咱們把 ROC 曲線下方的面積稱爲 AUC (Area Under Curve),有了這個概念後,只需一個數值就能夠衡量模型的好壞了,上面示例模型的 AUC 以下:

一般狀況下咱們都使用 AUC 來評估模型,既然是」一般」,那確定就有例外:當患病率 (或正樣本佔比) 很是小時,Ture Negative 就會很是大,這個值就會使影響 FPR,使 FPR 較小,爲了不這種影響,咱們能夠將 FPR 用另外一個指標代替:Precision

Precision = \frac{TP}{TP+FP}

Precision 的含義是預測患病的樣本中,實際也患病的比例;這樣,將 Precision 和 Sensitivity 結合起來,會讓咱們更專一於患病 (正樣本) 的預測效果,而機器學習中的另外一個效果指標:F1 Score,就是專門負責這件事兒的

F1~Score = 2\times \frac{Precision\times Recall}{Precision + Recall}

上面的公式中,Recall 等價於 Sensitivity,和 AUC 同樣,兩個模型互相比較,F1 Score 越大者,預測效果越好,並且 F1 Score 能更好的衡量正樣本的預測效果。

總結

本文經過一個醫學例子——是否患心臟病——來說述什麼是混淆矩陣、ROC 曲線、AUC 及 F1 Score,其中,咱們還一塊兒學習了 ROC 曲線是如何畫出來的,最後,咱們還談到了 AUC 和 F1 Score 以及它們之間細微的差異。

須要注意的是,二分類評估並不限於對患病及未患病這兩種狀況的分類,考慮到通用性,你徹底能夠將本文中的患心臟病替換爲正樣本、把未患心臟病替換爲負樣本。

相關文章
相關標籤/搜索