3.5 Imbalanced Classification
不平衡分類是許多真實任務的常態。詐騙交易、設備故障、疾病陽性樣本、品質異常,通常都只佔整體資料的一小部分。這時候如果只看 accuracy,很容易被誤導。
假設 95% 都是正常樣本,一個永遠預測正常的模型也能有 95% accuracy,但它沒有抓到任何真正重要的異常樣本。
1. 建立不平衡資料
Notebook 使用 make_classification() 建立少數類約 5% 的資料。第一步一定要先看類別比例:
如果正類比例很低,accuracy 就不能當作主要判斷依據。
2. Class Weight
class_weight 的概念是讓少數類錯誤付出更高成本:
weights = compute_class_weight(
class_weight='balanced',
classes=classes,
y=y_train
)
class_weight = dict(zip(classes, weights))
訓練時傳入:
這不是複製少數類資料,而是在 loss 計算時提高少數類的重要性。
3. 評估指標
不平衡分類要看 confusion matrix、precision、recall、F1-score、AUC。
| 指標 | 問的問題 |
|---|---|
| Precision | 模型說異常的樣本,有多少是真的異常? |
| Recall | 真正異常的樣本,有多少被找出來? |
| F1-score | Precision 和 recall 的折衷 |
| AUC | 不同 threshold 下的整體排序能力 |
4. Threshold 調整
Notebook 比較 0.3、0.5、0.7 三個 threshold。門檻越低,通常 recall 越高,但誤報也會增加;門檻越高,通常 precision 越高,但漏報也會增加。
正式專案中,threshold 應該根據成本決定,而不是固定 0.5。
5. 如何套用自己的資料?
先把少數類定義成 1,多數類定義成 0。接著切分資料、標準化、計算 class weight、訓練模型、根據 precision/recall 選 threshold。
6. 小結
不平衡分類的重點不是追求最高 accuracy,而是根據任務成本找出合理的少數類偵測能力。