3.4 Multi-label Classification
多標籤分類和多類別分類看起來很像,但任務假設完全不同。多類別分類是一筆資料只能有一個答案;多標籤分類是一筆資料可以同時擁有多個標籤。
例如一篇文章可以同時屬於「AI」、「Python」、「教育」;一個商品可以同時是「熱銷」、「折扣」、「高退貨風險」;一筆設備資料也可能同時對應多種異常徵兆。
1. Multi-class vs Multi-label
| 任務 | 答案型態 | 輸出層 | Loss |
|---|---|---|---|
| Multi-class | 多個類別選一個 | softmax |
sparse_categorical_crossentropy |
| Multi-label | 多個標籤可同時成立 | 多個 sigmoid |
binary_crossentropy |
多標籤分類不能使用 softmax,因為 softmax 會讓類別彼此競爭;但多標籤任務中,label A 成立不代表 label B 不成立。
2. 建立多標籤資料
Notebook 使用:
X, y = make_multilabel_classification(
n_samples=3000,
n_features=20,
n_classes=5,
n_labels=2,
allow_unlabeled=False,
random_state=42
)
這裡的 y 是一個 0/1 矩陣。每一列是一筆資料,每一欄是一個標籤是否成立。
3. 模型設計
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(x_train.shape[1],)),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(32, activation='relu'),
tf.keras.layers.Dense(n_labels, activation='sigmoid')
])
最後一層有幾個 label,就有幾個 sigmoid。每個 sigmoid 都負責判斷一個 label 是否成立。
4. Threshold 與評估
模型輸出的是機率矩陣:
多標籤任務常看 micro F1 和 macro F1。Micro F1 把所有 label 的 TP/FP/FN 合在一起算;Macro F1 則是每個 label 各自算 F1 再平均。
5. 如何套用自己的資料?
若原始資料是逗號分隔標籤,例如:
需要先轉成 multi-hot 矩陣。套用時請修改 label_names、n_labels、輸出層神經元數量與 threshold。
6. 小結
Multi-label Classification 的核心是多個 sigmoid 和 binary crossentropy。評估時不能只看 accuracy,應該觀察每個 label 的 precision、recall、F1,以及整體 micro/macro F1。