跳轉到

3.5 Imbalanced Classification

範例程式:Open In Colab

不平衡分類是許多真實任務的常態。詐騙交易、設備故障、疾病陽性樣本、品質異常,通常都只佔整體資料的一小部分。這時候如果只看 accuracy,很容易被誤導。

假設 95% 都是正常樣本,一個永遠預測正常的模型也能有 95% accuracy,但它沒有抓到任何真正重要的異常樣本。

1. 建立不平衡資料

Notebook 使用 make_classification() 建立少數類約 5% 的資料。第一步一定要先看類別比例:

pd.Series(y).value_counts(normalize=True)

如果正類比例很低,accuracy 就不能當作主要判斷依據。

2. Class Weight

class_weight 的概念是讓少數類錯誤付出更高成本:

weights = compute_class_weight(
    class_weight='balanced',
    classes=classes,
    y=y_train
)
class_weight = dict(zip(classes, weights))

訓練時傳入:

model.fit(x_train, y_train, class_weight=class_weight)

這不是複製少數類資料,而是在 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,而是根據任務成本找出合理的少數類偵測能力。