JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

ROC 曲線、AUC 與決策閾值

大多數分類器並不直接給出「是」或「否」——它們給出一個分數,而界線由你來劃。本指南將展示 ROC 曲線、AUC 與精確率-召回率曲線如何讓你一次看清所有可能的界線,以及如何挑出你的問題真正需要的那一條。

分數,而非判決

到現在,你已經會讀混淆矩陣、會算精確率召回率了。但所有這些數字背後藏著一個假設:模型已經做出了「是」或「否」的判定。然而現實中,幾乎每個分類器——邏輯迴歸隨機森林、以Sigmoid收尾的神經網路——都不會直接遞給你一個判決,它遞給你的是一個分數:一個常在 0 到 1 之間的數,表示它對正類傾向有多強。

要把分數變成決定,你需要一個閾值——一條切分線。分數高於這條線,就判為正;低於它,就判為負。常見的預設值 0.5 看起來很自然,但它只是一種約定,並非法則。把閾值往上挪,你就更嚴格(正例更少);往下挪,你就更寬鬆。你之前學過的每個指標——精確率、召回率、F1——都悄悄取決於你把這條線劃在哪裡。

ROC 曲線:一次看盡所有閾值

與其鎖定一個閾值,不如把*所有*閾值都試一遍,再把結果畫出來?這正是 [[roc-curve|ROC 曲線]]所做的事。對每一個可能的切分點,它衡量兩件事:真正例率(即召回率——你抓到的真實正例所占的比例)和假正例率(你錯誤標記的真實負例所占的比例)。把假正例率放在橫軸、真正例率放在縱軸,再讓閾值從嚴到寬地掃過,連成的點跡就是 ROC 曲線。

看清兩個角,畫面就清晰了。在很嚴的閾值下(要求極高分),你幾乎什麼都不標記:兩個比率都接近 0,落在左下角。在很寬的閾值下,你什麼都標記:兩個比率都接近 1,落在右上角。一個只會瞎猜的無用模型,會沿著從一角到另一角的對角線走。好模型則向左上角拱起——在抓住大量真正例的同時,把假正例壓得很低。曲線越貼近那個左上角,模型就越好。

TPR
 1 |          ____------  good model (bows to top-left)
   |      _--/
   |    _/        ....  random guess (diagonal)
   |  _/      ....
   | /    ....
 0 |/ ...______________________
   0                          1   FPR
ROC 曲線掃過每一個閾值。對角線相當於拋硬幣;向左上角拱起的弧度才是真本事。

AUC:把曲線壓成一個數

一整條曲線很難塞進表格,於是人們用 [[auc|AUC]] 來概括它——即 *ROC 曲線下的面積*。完美的模型填滿整個方框:AUC = 1.0。瞎猜走對角線,把方框切成兩半:AUC = 0.5。所以 AUC 介於 0.5(毫無價值)與 1.0(完美無缺)之間,越大越好。AUC 低於 0.5 意味著模型比隨機還差——通常說明你的標籤弄反了。

AUC 有一個優美而直觀的含義:它是模型給*隨機抽取的一個正例*打出的分數高於*隨機抽取的一個負例*的機率。換句話說,它衡量的是排序品質——模型把正例排在負例之上的能力——而且這一衡量*與任何閾值無關*。這正是 AUC 在回答「模型好不好?」時如此受歡迎的原因:它評判的是分數本身,而非某個任意的切分點。

當 ROC 說謊:類別失衡與 PR 曲線

ROC 有一個盲點,而它恰恰在現實最棘手處暴露出來:[[class-imbalance|類別失衡]]。設想詐欺偵測,每 1000 筆交易裡只有 1 筆是詐欺。假正例*率*的分母是那一大堆負例,因此即便有成千上萬次誤報,它也幾乎紋絲不動。一個模型可以拿出漂亮的 0.95 AUC,卻仍把每一起真詐欺埋在誤報的大山之下——因為 ROC 曲線從不去看你*標記出來*的案例裡到底有多少是對的。

這正是 [[precision-recall-curve|精確率-召回率曲線]]大顯身手之處。它把精確率(在我標記的全部裡,有多少是對的?)對召回率(在所有真實正例裡,我抓到了多少?)作圖,同樣掃過每一個閾值。由於精確率只盯著你的正類預測,它*不會*被一片浩瀚的簡單負例稀釋。在正例稀少的問題上,一個在 ROC 上看似不錯的平庸模型,會暴露出一條可憐下垂的 PR 曲線——這才是「你的警報有多常出錯」的誠實寫照。

為你的真實問題選定閾值

曲線和 AUC 告訴你模型的*潛力*。可上線時仍需要一個數:閾值。而正確的閾值不是數學問題,而是*代價*問題。要問:哪種錯誤更傷人?把一封真實的工作邀約扔進垃圾箱(假正例)的垃圾郵件過濾器,遠比放過一封垃圾郵件糟糕,於是你調高閾值以保護精確率。漏掉一個真實腫瘤(假負例)的癌症篩查是災難性的,於是你調低閾值以保護召回率,寧可接受更多可由複查排除的誤報。

  1. 寫下你的問題中每種錯誤的代價——以金錢、傷害或使用者信任來計。要具體;模糊的直覺只會帶來模糊的閾值。
  2. 選出這些代價所對應的指標:漏檢致命就追求高召回率,誤報昂貴就追求高精確率,兩者都重要就用 F1 或加權折中。
  3. 在驗證集上掃過各個閾值,記錄每個閾值下的該指標,挑出使其最大的那個閾值。
  4. 鎖定該閾值,再在從未碰過的測試集上報告最終數字,確保這一選擇沒有被悄悄過擬合。

把這幾層理清,你就再也不會被單一數字蒙騙了。AUC 與曲線為模型排序,且對任何閾值都成立;閾值把分數變成行動,必須反映真實世界的代價;在所選閾值下的精確率與召回率才是你的使用者真正要承受的。一個 AUC 高達 0.99 的模型,若其工作點悄悄犧牲了你最承受不起的那種錯誤,依然可能是錯的工具。