分數,而非判決
到現在,你已經會讀混淆矩陣、會算精確率和召回率了。但所有這些數字背後藏著一個假設:模型已經做出了「是」或「否」的判定。然而現實中,幾乎每個分類器——邏輯迴歸、隨機森林、以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
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 告訴你模型的*潛力*。可上線時仍需要一個數:閾值。而正確的閾值不是數學問題,而是*代價*問題。要問:哪種錯誤更傷人?把一封真實的工作邀約扔進垃圾箱(假正例)的垃圾郵件過濾器,遠比放過一封垃圾郵件糟糕,於是你調高閾值以保護精確率。漏掉一個真實腫瘤(假負例)的癌症篩查是災難性的,於是你調低閾值以保護召回率,寧可接受更多可由複查排除的誤報。
- 寫下你的問題中每種錯誤的代價——以金錢、傷害或使用者信任來計。要具體;模糊的直覺只會帶來模糊的閾值。
- 選出這些代價所對應的指標:漏檢致命就追求高召回率,誤報昂貴就追求高精確率,兩者都重要就用 F1 或加權折中。
- 在驗證集上掃過各個閾值,記錄每個閾值下的該指標,挑出使其最大的那個閾值。
- 鎖定該閾值,再在從未碰過的測試集上報告最終數字,確保這一選擇沒有被悄悄過擬合。
把這幾層理清,你就再也不會被單一數字蒙騙了。AUC 與曲線為模型排序,且對任何閾值都成立;閾值把分數變成行動,必須反映真實世界的代價;在所選閾值下的精確率與召回率才是你的使用者真正要承受的。一個 AUC 高達 0.99 的模型,若其工作點悄悄犧牲了你最承受不起的那種錯誤,依然可能是錯的工具。