多標簽分類基本上,有三種方法來解決一個多標簽分類問題,即:
- 問題轉換
- 改編算法
- 集成方法
4.1問題轉換
在這個方法中,我們將嘗試把多標簽問題轉換為單標簽問題。這種方法可以用三種不同的方式進行:
- 二元關聯(Binary Relevance)
- 分類器鏈(Classifier Chains)
- 標簽Powerset(Label Powerset)
4.4.1二元關聯(Binary Relevance)
這是最簡單的技術,它基本上把每個標簽當作單獨的一個類分類問題。例如,讓我們考慮如下所示的一個案例。我們有這樣的數據集,X是獨立的特征,Y是目標變量。

在二元關聯中,這個問題被分解成4個不同的類分類問題,如下圖所示。

我們不需要手動操作,multi-learn庫在python中提供了它的實現。那么,讓我們看看它在隨機生成的數據上的實現。
# using binary relevance from skmultilearn.problem_transform import BinaryRelevance from sklearn.naive_bayes import GaussianNB # initialize binary relevance multi-label classifier # with a gaussian naive bayes base classifier classifier = BinaryRelevance(GaussianNB()) # train classifier.fit(X_train, y_train) # predict predictions = classifier.predict(X_test)
注意:在這里,我們使用了Naive Bayes的算法,你也可以使用任何其他的分類算法。
現在,在一個多標簽分類問題中,我們不能簡單地用我們的標准來計算我們的預測的准確性。所以,我們將使用accuracy score。這個函數計算子集的精度,這意味着預測的標簽集應該與真正的標簽集完全匹配。
那么,讓我們計算一下預測的准確性。
from sklearn.metrics import accuracy_score accuracy_score(y_test,predictions)
0.45454545454545453
我們的准確率達到了45%,還不算太糟。它是最簡單和有效的方法,但是這種方法的惟一缺點是它不考慮標簽的相關性,因為它單獨處理每個目標變量。
4.1.2分類器鏈(Classifier Chains)
在這種情況下,第一個分類器只在輸入數據上進行訓練,然后每個分類器都在輸入空間和鏈上的所有之前的分類器上進行訓練。
讓我們試着通過一個例子來理解這個問題。在下面給出的數據集里,我們將X作為輸入空間,而Y作為標簽。

在分類器鏈中,這個問題將被轉換成4個不同的標簽問題,就像下面所示。黃色部分是輸入空間,白色部分代表目標變量。

這與二元關聯非常相似,唯一的區別在於它是為了保持標簽相關性而形成的。那么,讓我們嘗試使用multi-learn庫來實現它。
# using classifier chains from skmultilearn.problem_transform import ClassifierChain from sklearn.naive_bayes import GaussianNB # initialize classifier chains multi-label classifier # with a gaussian naive bayes base classifier classifier = ClassifierChain(GaussianNB()) # train classifier.fit(X_train, y_train) # predict predictions = classifier.predict(X_test) accuracy_score(y_test,predictions)
0.21212121212121213
我們可以看到,使用這個我們得到了21%的准確率,這比二元關聯要低得多。可能是因為沒有標簽相關性,因為我們已經隨機生成了數據。
4.1.3標簽Powerset(Label Powerset)
在這方面,我們將問題轉化為一個多類問題,一個多類分類器在訓練數據中發現的所有唯一的標簽組合上被訓練。讓我們通過一個例子來理解它。

在這一點上,我們發現x1和x4有相同的標簽。同樣的,x3和x6有相同的標簽。因此,標簽powerset將這個問題轉換為一個單一的多類問題,如下所示。

因此,標簽powerset給訓練集中的每一個可能的標簽組合提供了一個獨特的類。讓我們看看它在Python中的實現。
# using Label Powerset from skmultilearn.problem_transform import LabelPowerset from sklearn.naive_bayes import GaussianNB # initialize Label Powerset multi-label classifier # with a gaussian naive bayes base classifier classifier = LabelPowerset(GaussianNB()) # train classifier.fit(X_train, y_train) # predict predictions = classifier.predict(X_test) accuracy_score(y_test,predictions)
0.5757575757575758
這使我們在之前討論過的三個問題中得到了最高的准確性,57%。唯一的缺點是隨着訓練數據的增加,類的數量也會增加。因此,增加了模型的復雜性,並降低了精確度。
現在,讓我們看一下解決多標簽分類問題的第二種方法。
4.2改編算法
改編算法來直接執行多標簽分類,而不是將問題轉化為不同的問題子集。例如,kNN的多標簽版本是由MLkNN表示的。那么,讓我們快速地在我們的隨機生成的數據集上實現這個。
from skmultilearn.adapt import MLkNN classifier = MLkNN(k=20) # train classifier.fit(X_train, y_train) # predict predictions = classifier.predict(X_test) accuracy_score(y_test,predictions)
0.69
很好,你的測試數據已經達到了69%的准確率。
在一些算法中,例如隨機森林(Random Forest)和嶺回歸(Ridge regression),Sci-kit learn提供了多標簽分類的內置支持。因此,你可以直接調用它們並預測輸出。
如果你想了解更多關於其他類型的改編算法,你可以查看multi-learn庫。地址:http://scikit.ml/api/api/skmultilearn.adapt.html#module-skmultilearn.adapt
4.3集成方法
集成總是能產生更好的效果。Scikit-Multilearn庫提供不同的組合分類功能,你可以使用它來獲得更好的結果。
對於直接實現,你可以查看:http://scikit.ml/api/classify.html#ensemble-approaches
