跳轉到

3.4 Multi-label Classification

範例程式:Open In Colab

多標籤分類和多類別分類看起來很像,但任務假設完全不同。多類別分類是一筆資料只能有一個答案;多標籤分類是一筆資料可以同時擁有多個標籤。

例如一篇文章可以同時屬於「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 與評估

模型輸出的是機率矩陣:

prob = model.predict(x_test, verbose=0)
y_pred = (prob >= 0.5).astype(int)

多標籤任務常看 micro F1 和 macro F1。Micro F1 把所有 label 的 TP/FP/FN 合在一起算;Macro F1 則是每個 label 各自算 F1 再平均。

5. 如何套用自己的資料?

若原始資料是逗號分隔標籤,例如:

article_1: AI, Python
article_2: AI, Education

需要先轉成 multi-hot 矩陣。套用時請修改 label_namesn_labels、輸出層神經元數量與 threshold。

6. 小結

Multi-label Classification 的核心是多個 sigmoid 和 binary crossentropy。評估時不能只看 accuracy,應該觀察每個 label 的 precision、recall、F1,以及整體 micro/macro F1。