⚖️ PR 曲線 vs ROC:不平衡資料實驗室

同一個模型,把正例比例從 30% 拖到 0.5%——親眼看 ROC 幾乎不動、PR 曲線直接塌下來。這就是中級最愛考的「ROC 過度樂觀」。

💡 白話定義

ROC 曲線:掃過所有門檻,畫「抓到多少正例(TPR)」對「誤傷多少負例(FPR)」。
PR 曲線:一樣掃門檻,但畫「查準率 Precision」對「查全率 Recall」——兩軸都只關心正例
關鍵差異藏在分母:FPR=FP÷所有負例。當負例多到爆(99.5%),就算誤報幾千筆,FPR 還是趴在地上→ROC 看起來永遠很美;Precision=TP÷(TP+FP) 把誤報直接攤在分母,多抓一筆錯的馬上掉——它才誠實。
ROC-AUC 適合:類別大致平衡、想看模型整體「排序能力」、比較模型鑑別力。
PR-AUC 適合:極度不平衡(詐欺 0.4%、故障 0.8%)、誤報有成本、關心「每抓一筆要誤傷幾筆」。

🎮 互動實驗:拖動不平衡比例

ROC-AUC: PR-AUC(AP): Recall=0.8 時 Precision:
拖動左邊的滑桿,把正例比例往下拉到 1% 以下試試 👀

🧠 發生了什麼事?

模型本身(鑑別力)完全沒變——變的只有類別比例。ROC 的兩個軸(TPR、FPR)都是「各自類內的比例」,跟兩類的相對數量無關,所以曲線幾乎不動;但 Precision 的分母同時吃 TP 與 FP,負例基數一大、FP 絕對數量暴增,Precision 就被稀釋。這也是為什麼報表上 ROC-AUC 0.97 的詐欺模型,上線後每抓 1 筆真詐欺可能誤攔 20 筆正常交易

✅ 自我檢測

Q1:極度不平衡時,為什麼 ROC-AUC 會「過度樂觀」?

因為 FPR 的分母是全部負例。負例極多時,FP 增加數千筆 FPR 也幾乎不動,ROC 曲線看不見誤報成本。

Q2:兩個模型 ROC-AUC 幾乎相同(0.93 vs 0.92),實務攔截表現卻差很大。該改看什麼?

PR-AUC(或固定 Recall 下的 Precision):兩軸都聚焦正類,能忠實反映「每抓一筆誤傷幾筆」。

Q3:算 ROC/PR 曲線時,該餵 model.predict() 還是 predict_proba()?

predict_proba() 的連續機率。predict() 已用 0.5 門檻切成 0/1,整條曲線只剩一個點——這是實務最常見的評估 bug。

🎯 重點整理

① ROC 軸=TPR(Y)/FPR(X);PR 軸=Precision(Y)/Recall(X)。
② 極度不平衡 → ROC 樂觀、改看 PR-AUC/F1;平衡資料兩者皆可。
③ Precision 把 FP 攤在分母=看得見誤報成本;FPR 被巨大負例稀釋。
④ 曲線要用連續分數畫(predict_proba);隨機猜的 PR 基準線=正例比例(不是 0.5)。