解決多標(biāo)簽分類問題(包括案例研究)

由于某些原因,回歸和分類問題總會引起機(jī)器學(xué)習(xí)領(lǐng)域的大部分關(guān)注鸭叙。多標(biāo)簽分類在數(shù)據(jù)科學(xué)中是一個比較令人頭疼的問題。在這篇文章中拣宏,我將給你一個直觀的解釋沈贝,說明什么是多標(biāo)簽分類,以及如何解決這個問題勋乾。

1.多標(biāo)簽分類是什么?

讓我們來看看下面的圖片宋下。

image

如果我問你這幅圖中有一棟房子,你會怎樣回答? 選項(xiàng)為“Yes”或“No”辑莫。

或者這樣問学歧,所有的東西(或標(biāo)簽)與這幅圖有什么關(guān)系?

image

在這些類型的問題中,我們有一組目標(biāo)變量各吨,被稱為多標(biāo)簽分類問題枝笨。那么,這兩種情況有什么不同嗎? 很明顯揭蜒,有很大的不同横浑,因?yàn)樵诘诙N情況下,任何圖像都可能包含不同圖像的多個不同的標(biāo)簽屉更。

但在深入講解多標(biāo)簽之前伪嫁,我想解釋一下它與多分類問題有何不同,讓我們試著去理解這兩組問題的不同之處偶垮。

2.多標(biāo)簽vs多分類

用一個例子來理解這兩者之間的區(qū)別张咳。

image

對于任何一部電影帝洪,電影的中央委員會會根據(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ù)集的樣子。

image

在這里缰盏,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)簽分類問題弄诲,即:

  1. 問題轉(zhuǎn)換
  2. 改編算法
  3. 集成方法

4.1問題轉(zhuǎn)換

在這個方法中,我們將嘗試把多標(biāo)簽問題轉(zhuǎn)換為單標(biāo)簽問題娇唯。這種方法可以用三種不同的方式進(jìn)行:

  1. 二元關(guān)聯(lián)(Binary Relevance)
  2. 分類器鏈(Classifier Chains)
  3. 標(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)變量伶授。

image

在二元關(guān)聯(lián)中,這個問題被分解成4個不同的類分類問題流纹,如下圖所示糜烹。

image

我們不需要手動操作,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)簽惑折。

image

在分類器鏈中,這個問題將被轉(zhuǎn)換成4個不同的標(biāo)簽問題枯跑,就像下面所示惨驶。黃色部分是輸入空間,白色部分代表目標(biāo)變量敛助。

image

這與二元關(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)練存璃。讓我們通過一個例子來理解它。

image

在這一點(diǎn)上雕拼,我們發(fā)現(xiàn)x1和x4有相同的標(biāo)簽纵东。同樣的,x3和x6有相同的標(biāo)簽啥寇。因此偎球,標(biāo)簽powerset將這個問題轉(zhuǎn)換為一個單一的多類問題,如下所示辑甜。

image

因此衰絮,標(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)記為不同的對象捞挥、人或概念。

image

5.3生物信息學(xué)

多標(biāo)簽分類在生物信息學(xué)領(lǐng)域有很多用途忧吟,例如砌函,在酵母數(shù)據(jù)集中的基因分類。它還被用來使用幾個未標(biāo)記的蛋白質(zhì)來預(yù)測蛋白質(zhì)的多重功能溜族。

5.4文本分類

谷歌新聞所做的是讹俊,將每條新聞都標(biāo)記為一個或多個類別,這樣它就會顯示在不同的類別之下煌抒。
例如仍劈,看看下面的圖片。

image

圖片來源: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)簽分類問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末况既,一起剝皮案震驚了整個濱河市这溅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棒仍,老刑警劉巖悲靴,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異莫其,居然都是意外死亡癞尚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門乱陡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浇揩,“玉大人,你說我怎么就攤上這事憨颠「旎眨” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長膜廊。 經(jīng)常有香客問我,道長淫茵,這世上最難降的妖魔是什么爪瓜? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮匙瘪,結(jié)果婚禮上铆铆,老公的妹妹穿的比我還像新娘。我一直安慰自己丹喻,他們只是感情好薄货,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碍论,像睡著了一般谅猾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鳍悠,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天税娜,我揣著相機(jī)與錄音,去河邊找鬼藏研。 笑死敬矩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蠢挡。 我是一名探鬼主播弧岳,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼业踏!你這毒婦竟也來了禽炬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤勤家,失蹤者是張志新(化名)和其女友劉穎瞎抛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體却紧,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桐臊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晓殊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片断凶。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖巫俺,靈堂內(nèi)的尸體忽然破棺而出认烁,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布却嗡,位于F島的核電站舶沛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窗价。R本人自食惡果不足惜如庭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撼港。 院中可真熱鬧坪它,春花似錦、人聲如沸帝牡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽靶溜。三九已至开瞭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罩息,已是汗流浹背惩阶。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扣汪,地道東北人断楷。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像崭别,于是被迫代替她去往敵國和親冬筒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361