認識 ROC / AUC 與 Confusion Matrix

Time: 2019.09.14git

本文首發於 www.f1renze.me/ 轉載請註明出處!github

混淆矩陣(Confusion Matrix)

如無特殊說明,文中提到的分類皆指二分類任務markdown

在瞭解 ROC 以前,先得了解什麼是 Confusion Matrix (It really confused me when I see it first time. XD)。實際上混淆矩陣可以幫助咱們瞭解分類任務模型的偏好性,如正判(True)較多或誤判(False)較多,或是更多預測爲 Positive / Negative (取決於 threshold 取值)。機器學習

更專業地說它被用於機器學習分類任務的性能度量,即衡量模型泛化能力的評價標準。oop

圖片來源:dataschool

Confusion Matrix 由 4 個術語組成,咱們如今把分類問題假設爲醫生診斷病人是否患流感:性能

  • True Positive (TP)學習

    若病人實際上患了流感且醫生確診爲流感,稱爲 TP。測試

  • True Negative (TN)spa

    若病人未患流感且醫生診斷該病人未患流感,稱爲 TN。code

  • False Positive (FP)

    若病人未患流感但被誤診爲已患流感,稱爲 FP,又稱 「Type I error」。

  • False Negative (FN)

    若病人患流感但被誤診爲未患流感,稱爲 FN,又稱 「Type II error」。

因此實際上 Confusion Matrix 並不難理解,T / F 表示模型預測值與實際值是否符合,P / N 表示模型預測的類別。

由 Confusion Matrix 延伸的幾個指標

  • Accuracy ,精度,最經常使用的指標。

    表示分類預測正確的樣本數佔整體樣本的比例。

    (TP + TN) / (TP + FP + TN + FN)

  • Recall,又稱查全率。

    表示全部實際爲 Positive 類別的樣本中被預測準確的機率。

    Recall = TP / (TP + FN)

  • Precision,又稱查準率。

    表示全部被預測爲 Positive 的樣本中預測準確的機率。

    Precision = TP / (TP + FP)

    通常來講 Precision 高時 Recall 會偏低,反之 Recall 高時 Precision 偏低,因此須要引入 F-Score 來比較不一樣模型的性能。

  • F-Score,又稱 F1-score。

    爲 Precision 和 Recall 的調和平均值,值越接近 1 越好,反之越接近 0 越差。

    F-Score = 2*(Recall * Precision) / (Recall + Precision)

回到上文中診斷流感的例子來講明這幾個指標。
若 Accuracy 爲 90%,表示用此模型預測時,每10個樣本里有9個預測正確,1個預測錯誤。
若 Precision 爲 80%,表示用此模型預測時,每10個被判斷爲患流感的例子中就有2例誤診。
若 Recall 爲 70%,表示用此模型預測時,每10個實際患流感的病人中就有3個病人會被告知沒有患流感。
因此在這個應用場景中咱們更看重的是 Recall,而 F-Score 的通常形式 Fβ 能表示模型對於 Precision / Recall 的不一樣偏好。

Fß公式
β = 1 時爲標準的 F1;β > 1 時 Recall 有更大影響,0 < β < 1 時 Precision 有更大影響。

什麼是 ROC 曲線?

因爲分類器分類過程其實是爲樣本計算出預測機率,根據機率與事先定義的 threshold (一般爲 0.5)進行比較,若大於 threshold 爲正例(Positive),反之爲反例(Negative)。若根據預測機率對測試集樣本進行排序,預測機率值最大的樣本即爲最可能爲正例的樣本,預測機率值最小的樣本即爲最可能爲反例的樣本。

在不一樣的應用場景下采起不一樣的 threshold 能獲得更符合預期的結果,以上文中診斷流感的場景來看,因爲咱們更重視 Recall,故採起較低的 threshold 會下降患流感病人被認爲健康的機率(而後致使更多的誤診,逃);但若在商品推薦系統中,爲了儘量少打擾用戶,更但願推薦的商品是用戶更感興趣的,此時咱們更看重 Precision,故調高 threshold 更符合指望。

所以排序質量決定了分類器在不一樣任務下的指望泛化性能的好壞,而 ROC 曲線可以很好地表示整體狀況下分類器的泛化性能。典型的 ROC 曲線以 False Positive Rate 爲 x 軸,True Positive Rate 爲 y 軸,定義以下:

  • TPR / Recall
    TPR = TP / (TP + FN)
  • FPR
    FPR = FP / (TN + FP)

ROC 曲線繪製原理 根據 n 個測試樣本計算出的預測機率排序,輪詢將每一個預測值設置爲 threshold 並計算此時的 TPR & FPR 爲 (x, y) 座標,擬合 n 個座標點造成的曲線即爲 ROC 曲線。

什麼是 AUC

AUC 的全稱是 Area Under Curve,顧名思義其爲 ROC 曲線下的面積,不一樣的 AUC 值表示模型區分不一樣樣本的能力。

理想狀況下,模型將樣本徹底區分爲2類,此時 ROC 曲線以下所示,AUC = 1。

auc_1.png
auc_1_roc.png

大多數時候 ROC 曲線是下圖這樣的,曲線總體接近左上方;AUC = 0.7 表示 70% 的樣本會被正確分類,於此同時也有 FN 和 FP 的樣本。

auc_0.7.png
auc_0.7_roc.png

ROC 曲線處於對角線時 AUC = 0.5,表示模型極可能有問題,由於其區分類型的能力與隨機無異。

auc_0.5.png
auc_0.5_roc.png

AUC 低於 0.5 甚至接近 0 時,未必是一件壞事,說明模型將樣本類型區分反了,若此時將 1 - 機率的值置爲新的機率,AUC就接近 1 了!(別問我爲啥知道)

auc_0.png
auc_0_roc.png

Python 實現

代碼地址:gist.github.com/F1renze/6ae…

以下圖所示:

30個隨機數據生成的 ROC 曲線,threshold 取值 0.5

延伸閱讀

相關文章
相關標籤/搜索