由于某些原因,回歸和分類問題總會引起機(jī)器學(xué)習(xí)領(lǐng)域的大部分關(guān)注鸭叙。多標(biāo)簽分類在數(shù)據(jù)科學(xué)中是一個比較令人頭疼的問題。在這篇文章中拣宏,我將給你一個直觀的解釋沈贝,說明什么是多標(biāo)簽分類,以及如何解決這個問題勋乾。
1.多標(biāo)簽分類是什么?
讓我們來看看下面的圖片宋下。
如果我問你這幅圖中有一棟房子,你會怎樣回答? 選項(xiàng)為“Yes”或“No”辑莫。
或者這樣問学歧,所有的東西(或標(biāo)簽)與這幅圖有什么關(guān)系?
在這些類型的問題中,我們有一組目標(biāo)變量各吨,被稱為多標(biāo)簽分類問題枝笨。那么,這兩種情況有什么不同嗎? 很明顯揭蜒,有很大的不同横浑,因?yàn)樵诘诙N情況下,任何圖像都可能包含不同圖像的多個不同的標(biāo)簽屉更。
但在深入講解多標(biāo)簽之前伪嫁,我想解釋一下它與多分類問題有何不同,讓我們試著去理解這兩組問題的不同之處偶垮。
2.多標(biāo)簽vs多分類
用一個例子來理解這兩者之間的區(qū)別张咳。
對于任何一部電影帝洪,電影的中央委員會會根據(jù)電影的內(nèi)容頒發(fā)證書。例如脚猾,如果你看上面的圖片葱峡,這部電影被評為“UA”(意思是“12歲以下兒童需在父母陪同下觀看”)。還有其他類型的證書類龙助,如“A”(僅限于成人)或“U”(不受限制的公開放映)砰奕,但可以肯定的是,每部電影只能在這三種類型的證書中進(jìn)行分類提鸟。簡而言之军援,有多個類別,但每個實(shí)例只分配一個称勋,因此這些問題被稱為多類分類問題胸哥。
同時,你回顧一下這張圖片赡鲜,這部電影被歸類為喜劇和浪漫類型空厌。但不同的是,這一次银酬,每部電影都有可能被分成一個或多個不同的類別嘲更。
所以每個實(shí)例都可以使用多個類別進(jìn)行分配。因此揩瞪,這些類型的問題被稱為多標(biāo)簽分類問題赋朦。
現(xiàn)在你應(yīng)該可以區(qū)分多標(biāo)簽和多分類問題了。那么李破,讓我們開始處理多標(biāo)簽這種類型的問題宠哄。
3.加載和生成多標(biāo)簽數(shù)據(jù)集
Scikit-learn提供了一個獨(dú)立的庫scikit-multilearn,用于多種標(biāo)簽分類舆驶。為了更好的理解瓜浸,讓我們開始在一個多標(biāo)簽的數(shù)據(jù)集上進(jìn)行練習(xí)。scikit-multilearn庫地址:http://scikit.ml/api/datasets.html
你可以從MULAN package提供的存儲庫中找到實(shí)際的數(shù)據(jù)集。這些數(shù)據(jù)集以ARFF格式呈現(xiàn)顶猜。存儲庫地址:http://mulan.sourceforge.net/datasets-mlc.html
因此,為了開始使用這些數(shù)據(jù)集扰法,請查看下面的Python代碼栓票,將其加載到你的計(jì)算機(jī)上。在這里颜启,我已經(jīng)從存儲庫中下載了酵母(yeast)數(shù)據(jù)集偷俭。
import scipy
from scipy.io import arff
data, meta = scipy.io.arff.loadarff('/Users/shubhamjain/Documents/yeast/yeast-train.arff')
df = pd.DataFrame(data)
這就是數(shù)據(jù)集的樣子。
在這里缰盏,Att表示屬性或獨(dú)立變量涌萤,class表示目標(biāo)變量淹遵。
出于實(shí)踐目的,我們有另一個選項(xiàng)來生成一個人工的多標(biāo)簽數(shù)據(jù)集负溪。
from sklearn.datasets import make_multilabel_classification
this will generate a random multi-label dataset
X, y = make_multilabel_classification(sparse = True, n_labels = 20,
return_indicator = 'sparse', allow_unlabeled = False)
讓我們了解一下上面所使用的參數(shù)透揣。
sparse(稀疏):如果是True,返回一個稀疏矩陣川抡,稀疏矩陣表示一個有大量零元素的矩陣辐真。
n_labels:每個實(shí)例的標(biāo)簽的平均數(shù)量。
return_indicator:“sparse”在稀疏的二進(jìn)制指示器格式中返回Y崖堤。
allow_unlabeled:如果是True侍咱,有些實(shí)例可能不屬于任何類。
你一定會注意到密幔,我們到處都使用了稀疏矩陣楔脯,而scikit-multilearn也建議使用稀疏格式的數(shù)據(jù),因?yàn)樵趯?shí)際數(shù)據(jù)集中非常罕見老玛。一般來說淤年,分配給每個實(shí)例的標(biāo)簽的數(shù)量要少得多。
好了蜡豹,現(xiàn)在我們已經(jīng)準(zhǔn)備好了數(shù)據(jù)集麸粮,讓我們快速學(xué)習(xí)解決多標(biāo)簽問題的技術(shù)。
4.解決多標(biāo)簽分類問題的技術(shù)
基本上镜廉,有三種方法來解決一個多標(biāo)簽分類問題弄诲,即:
- 問題轉(zhuǎn)換
- 改編算法
- 集成方法
4.1問題轉(zhuǎn)換
在這個方法中,我們將嘗試把多標(biāo)簽問題轉(zhuǎn)換為單標(biāo)簽問題娇唯。這種方法可以用三種不同的方式進(jìn)行:
- 二元關(guān)聯(lián)(Binary Relevance)
- 分類器鏈(Classifier Chains)
- 標(biāo)簽Powerset(Label Powerset)
4.4.1二元關(guān)聯(lián)(Binary Relevance)
這是最簡單的技術(shù)齐遵,它基本上把每個標(biāo)簽當(dāng)作單獨(dú)的一個類分類問題。例如塔插,讓我們考慮如下所示的一個案例梗摇。我們有這樣的數(shù)據(jù)集,X是獨(dú)立的特征想许,Y是目標(biāo)變量伶授。
在二元關(guān)聯(lián)中,這個問題被分解成4個不同的類分類問題流纹,如下圖所示糜烹。
我們不需要手動操作,multi-learn庫在python中提供了它的實(shí)現(xiàn)漱凝。那么疮蹦,讓我們看看它在隨機(jī)生成的數(shù)據(jù)上的實(shí)現(xiàn)。
# 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的算法愕乎,你也可以使用任何其他的分類算法阵苇。
現(xiàn)在,在一個多標(biāo)簽分類問題中妆毕,我們不能簡單地用我們的標(biāo)準(zhǔn)來計(jì)算我們的預(yù)測的準(zhǔn)確性慎玖。所以,我們將使用accuracy score笛粘。這個函數(shù)計(jì)算子集的精度趁怔,這意味著預(yù)測的標(biāo)簽集應(yīng)該與真正的標(biāo)簽集完全匹配。
那么薪前,讓我們計(jì)算一下預(yù)測的準(zhǔn)確性润努。
from sklearn.metrics import accuracy_score
accuracy_score(y_test,predictions)
0.45454545454545453
我們的準(zhǔn)確率達(dá)到了45%,還不算太糟示括。它是最簡單和有效的方法铺浇,但是這種方法的惟一缺點(diǎn)是它不考慮標(biāo)簽的相關(guān)性,因?yàn)樗鼏为?dú)處理每個目標(biāo)變量垛膝。
4.1.2分類器鏈(Classifier Chains)
在這種情況下鳍侣,第一個分類器只在輸入數(shù)據(jù)上進(jìn)行訓(xùn)練,然后每個分類器都在輸入空間和鏈上的所有之前的分類器上進(jìn)行訓(xùn)練吼拥。
讓我們試著通過一個例子來理解這個問題倚聚。在下面給出的數(shù)據(jù)集里,我們將X作為輸入空間凿可,而Y作為標(biāo)簽惑折。
在分類器鏈中,這個問題將被轉(zhuǎn)換成4個不同的標(biāo)簽問題枯跑,就像下面所示惨驶。黃色部分是輸入空間,白色部分代表目標(biāo)變量敛助。
這與二元關(guān)聯(lián)非常相似粗卜,唯一的區(qū)別在于它是為了保持標(biāo)簽相關(guān)性而形成的。那么纳击,讓我們嘗試使用multi-learn庫來實(shí)現(xiàn)它续扔。
# 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%的準(zhǔn)確率评疗,這比二元關(guān)聯(lián)要低得多测砂∫鹆遥可能是因?yàn)闆]有標(biāo)簽相關(guān)性百匆,因?yàn)槲覀円呀?jīng)隨機(jī)生成了數(shù)據(jù)。
4.1.3標(biāo)簽Powerset(Label Powerset)
在這方面呜投,我們將問題轉(zhuǎn)化為一個多類問題加匈,一個多類分類器在訓(xùn)練數(shù)據(jù)中發(fā)現(xiàn)的所有唯一的標(biāo)簽組合上被訓(xùn)練存璃。讓我們通過一個例子來理解它。
在這一點(diǎn)上雕拼,我們發(fā)現(xiàn)x1和x4有相同的標(biāo)簽纵东。同樣的,x3和x6有相同的標(biāo)簽啥寇。因此偎球,標(biāo)簽powerset將這個問題轉(zhuǎn)換為一個單一的多類問題,如下所示辑甜。
因此衰絮,標(biāo)簽powerset給訓(xùn)練集中的每一個可能的標(biāo)簽組合提供了一個獨(dú)特的類。讓我們看看它在Python中的實(shí)現(xiàn)磷醋。
# 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
這使我們在之前討論過的三個問題中得到了最高的準(zhǔn)確性猫牡,57%。唯一的缺點(diǎn)是隨著訓(xùn)練數(shù)據(jù)的增加邓线,類的數(shù)量也會增加淌友。因此,增加了模型的復(fù)雜性骇陈,并降低了精確度震庭。
現(xiàn)在,讓我們看一下解決多標(biāo)簽分類問題的第二種方法缩歪。
4.2改編算法
改編算法來直接執(zhí)行多標(biāo)簽分類归薛,而不是將問題轉(zhuǎn)化為不同的問題子集。例如匪蝙,kNN的多標(biāo)簽版本是由MLkNN表示的主籍。那么,讓我們快速地在我們的隨機(jī)生成的數(shù)據(jù)集上實(shí)現(xiàn)這個逛球。
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
很好千元,你的測試數(shù)據(jù)已經(jīng)達(dá)到了69%的準(zhǔn)確率。
在一些算法中颤绕,例如隨機(jī)森林(Random Forest)和嶺回歸(Ridge regression)幸海,Sci-kit learn提供了多標(biāo)簽分類的內(nèi)置支持。因此奥务,你可以直接調(diào)用它們并預(yù)測輸出物独。
如果你想了解更多關(guān)于其他類型的改編算法,你可以查看multi-learn庫氯葬。地址:http://scikit.ml/api/api/skmultilearn.adapt.html#module-skmultilearn.adapt
4.3集成方法
集成總是能產(chǎn)生更好的效果挡篓。Scikit-Multilearn庫提供不同的組合分類功能,你可以使用它來獲得更好的結(jié)果。
對于直接實(shí)現(xiàn)官研,你可以查看:http://scikit.ml/api/classify.html#ensemble-approaches
5.案例研究
在現(xiàn)實(shí)世界中秽澳,多標(biāo)簽分類問題非常普遍。所以戏羽,來看看我們能在哪些領(lǐng)域找到它們担神。
5.1音頻分類
我們知道歌曲會被分類為不同的流派。他們也被分類為始花,如“放松的平靜”妄讯,或“悲傷的孤獨(dú)”等等情感或情緒的基礎(chǔ)。
來源:http://lpis.csd.auth.gr/publications/tsoumakas-ismir08.pdf
5.2圖像分類
使用圖像的多標(biāo)簽分類也有廣泛的應(yīng)用酷宵。圖像可以被標(biāo)記為不同的對象捞挥、人或概念。
5.3生物信息學(xué)
多標(biāo)簽分類在生物信息學(xué)領(lǐng)域有很多用途忧吟,例如砌函,在酵母數(shù)據(jù)集中的基因分類。它還被用來使用幾個未標(biāo)記的蛋白質(zhì)來預(yù)測蛋白質(zhì)的多重功能溜族。
5.4文本分類
谷歌新聞所做的是讹俊,將每條新聞都標(biāo)記為一個或多個類別,這樣它就會顯示在不同的類別之下煌抒。
例如仍劈,看看下面的圖片。
圖片來源:https://news.google.com/news/headlines/section/topic/TECHNOLOGY.en_in/Technology?ned=in&hl=en-IN
同樣的新聞出現(xiàn)在“Technology”,“Latest” 等類別中寡壮,因?yàn)樗呀?jīng)被分類為不同的標(biāo)簽贩疙。從而使其成為一個多標(biāo)簽分類問題。