大家好,在機(jī)器學(xué)習(xí)任務(wù)中,分類是一種監(jiān)督學(xué)習(xí)方法,用于根據(jù)輸入數(shù)據(jù)預(yù)測標(biāo)簽。例如,我們想要根據(jù)歷史特征預(yù)測某人是否對銷售優(yōu)惠感興趣,通過使用可用的訓(xùn)練數(shù)據(jù)訓(xùn)練機(jī)器學(xué)習(xí)模型,可以對輸入數(shù)據(jù)執(zhí)行分類任務(wù)。
平常會遇到一些經(jīng)典分類任務(wù),例如二元分類(兩個(gè)標(biāo)簽)和多類分類(兩個(gè)以上標(biāo)簽)。在這種情況下,我們會訓(xùn)練分類器,模型會嘗試從所有可用標(biāo)簽中預(yù)測一個(gè)標(biāo)簽。用于分類的數(shù)據(jù)集類似于下面的圖像:
上面的圖像顯示目標(biāo)(銷售優(yōu)惠)在二元分類中包含兩個(gè)標(biāo)簽,在多類分類中包含三個(gè)標(biāo)簽,模型會從可用特征中進(jìn)行訓(xùn)練,然后僅輸出一個(gè)標(biāo)簽。
多標(biāo)簽分類與二元或多類分類不同,在多標(biāo)簽分類中,我們不僅嘗試預(yù)測一個(gè)輸出標(biāo)簽,相反,多標(biāo)簽分類會嘗試預(yù)測盡可能多的適用于輸入數(shù)據(jù)的標(biāo)簽,輸出可以是從沒有標(biāo)簽到最大數(shù)量的可用標(biāo)簽。
多標(biāo)簽分類通常用于文本數(shù)據(jù)分類任務(wù),下面是一個(gè)多標(biāo)簽分類的示例數(shù)據(jù)集。
在上面的示例中,假設(shè)文本1到文本5是可以歸類為四個(gè)類別的句子:事件、體育、流行文化和自然。通過上述訓(xùn)練數(shù)據(jù),多標(biāo)簽分類任務(wù)可以預(yù)測哪個(gè)標(biāo)簽適用于給定的句子。每個(gè)類別之間并不相互對立,因?yàn)樗鼈儾皇腔コ獾模幻總€(gè)標(biāo)簽可以被視為獨(dú)立的。
更詳細(xì)地說,我們可以看到文本1標(biāo)記為體育和流行文化,而文本2標(biāo)記為流行文化和自然。這表明每個(gè)標(biāo)簽是互斥的,多標(biāo)簽分類的預(yù)測輸出可以是沒有標(biāo)簽或同時(shí)包含所有標(biāo)簽。
有了上述介紹,接下來嘗試使用Scikit-Learn搭建多標(biāo)簽分類器。
使用Scikit-Learn進(jìn)行多標(biāo)簽分類
本文將使用Kaggle上公開可用的生物醫(yī)學(xué)PubMed多標(biāo)簽分類數(shù)據(jù)集,該數(shù)據(jù)集包含各種特征,但本文只使用abstractText特征和它們的MeSH分類(A:解剖學(xué),B:有機(jī)體,C:疾病等)。示例數(shù)據(jù)如下圖所示:
【生物醫(yī)學(xué)PubMed多標(biāo)簽分類數(shù)據(jù)集】:https://www.kaggle.com/datasets/owaiskhan9654/pubmed-multilabel-text-classification
上述數(shù)據(jù)集表明,每篇論文都可以被分為多個(gè)類別,這就是多標(biāo)簽分類的案例。有了這個(gè)數(shù)據(jù)集,那么就可以使用Scikit-Learn建立多標(biāo)簽分類器,在訓(xùn)練模型之前,首先準(zhǔn)備好數(shù)據(jù)集。
import?pandas?as?pd
from?sklearn.feature_extraction.text?import?TfidfVectorizer
df?=?pd.read_csv('PubMed?Multi?Label?Text?Classification?Dataset?Processed.csv')
df?=?df.drop(['Title',?'meshMajor',?'pmid',?'meshid',?'meshroot'],?axis?=1)
X?=?df["abstractText"]
y?=?np.asarray(df[df.columns[1:]])
vectorizer?=?TfidfVectorizer(max_features=2500,?max_df=0.9)
vectorizer.fit(X)
在上面的代碼中,將文本數(shù)據(jù)轉(zhuǎn)換為TF-IDF表示,以便Scikit-Learn模型能夠接受訓(xùn)練數(shù)據(jù)。此外,為了簡化教程,本文跳過了預(yù)處理數(shù)據(jù)的步驟,例如刪除停頓詞。
數(shù)據(jù)轉(zhuǎn)換完成后,我們將數(shù)據(jù)集分割為訓(xùn)練集和測試集。
from?sklearn.model_selection?import?train_test_split
X_train,?X_test,?y_train,?y_test?=?train_test_split(X,?y,?test_size=0.2,?random_state=101)
??
X_train_tfidf?=?vectorizer.transform(X_train)
X_test_tfidf?=?vectorizer.transform(X_test)
完成所有準(zhǔn)備工作后,我們將開始訓(xùn)練多標(biāo)簽分類器。在Scikit-Learn中,我們將使用MultiOutputClassifier對象來訓(xùn)練多標(biāo)簽分類器模型。該模型背后的策略是為每個(gè)標(biāo)簽訓(xùn)練一個(gè)分類器,每個(gè)標(biāo)簽都有自己的分類器。
在這個(gè)示例中,我們將使用邏輯回歸,并使用MultiOutputClassifier將其擴(kuò)展到所有標(biāo)簽。
from?sklearn.multioutput?import?MultiOutputClassifier
from?sklearn.linear_model?import?LogisticRegression
clf?=?MultiOutputClassifier(LogisticRegression()).fit(X_train_tfidf,?y_train)
我們可以更改模型并調(diào)整傳遞給MultiOutputClasiffier的模型參數(shù),因此請根據(jù)自己的要求進(jìn)行管理。訓(xùn)練完成后,使用模型預(yù)測測試數(shù)據(jù)。
prediction?=?clf.predict(X_test_tfidf)
prediction
預(yù)測結(jié)果是每個(gè)MeSH類別的標(biāo)簽數(shù)組,每一行代表一個(gè)句子,每一列代表一個(gè)標(biāo)簽。
最后,我們需要對多標(biāo)簽分類器進(jìn)行評估,可以使用準(zhǔn)確率指標(biāo)來評估模型。
from?sklearn.metrics?import?accuracy_score
print('Accuracy?Score:?',?accuracy_score(y_test,?prediction))****
準(zhǔn)確率得分為0.145。
準(zhǔn)確度得分結(jié)果為0.145,這表明該模型只能在不到14.5%的情況下能預(yù)測出準(zhǔn)確的標(biāo)簽組合。然而,對于多標(biāo)簽預(yù)測評估來說,準(zhǔn)確率得分存在不足。準(zhǔn)確率得分需要每個(gè)句子的所有標(biāo)簽都出現(xiàn)在準(zhǔn)確的位置上,否則就會被認(rèn)為是錯(cuò)誤的。
例如,第一行預(yù)測與測試數(shù)據(jù)之間僅有一個(gè)標(biāo)簽的差異。
對于準(zhǔn)確率得分來說,這將被認(rèn)為是錯(cuò)誤的預(yù)測,因?yàn)闃?biāo)簽組合不同,這就是模型具有較低度量分?jǐn)?shù)的原因。
為了解決這個(gè)問題,我們必須評估標(biāo)簽的預(yù)測而不是它們的組合。在這種情況下,我們可以使用Hamming Loss評估指標(biāo)。漢明損失通過將錯(cuò)誤預(yù)測與總標(biāo)簽數(shù)的比例來計(jì)算,因?yàn)闈h明損失是一種損失函數(shù),得分越低越好(0表示沒有錯(cuò)誤預(yù)測,1表示所有預(yù)測都錯(cuò)誤)。
from?sklearn.metrics?import?hamming_loss
print('Hamming?Loss:?',?round(hamming_loss(y_test,?prediction),2))
漢明損失為0.13。
我們的多標(biāo)簽分類器Hamming Loss模型為0.13,這意味著我們的模型在獨(dú)立情況下約有13%的錯(cuò)誤預(yù)測,也就是說每個(gè)標(biāo)簽的預(yù)測可能有13%的錯(cuò)誤。
總結(jié)
多標(biāo)簽分類是一種機(jī)器學(xué)習(xí)任務(wù),其輸出可以是沒有標(biāo)簽或給定輸入數(shù)據(jù)的所有可能標(biāo)簽。這與二元或多類分類不同,其中標(biāo)簽輸出是相互排斥的。
使用Scikit-Learn的MultiOutputClassifier,我們可以開發(fā)多標(biāo)簽分類器,為每個(gè)標(biāo)簽訓(xùn)練一個(gè)分類器。在模型評估方面,最好使用Hamming Loss指標(biāo),因?yàn)闇?zhǔn)確率得分可能無法正確反映整體情況。文章來源:http://www.zghlxwxcb.cn/news/detail-666011.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-666011.html
到了這里,關(guān)于使用Scikit-Learn實(shí)現(xiàn)多標(biāo)簽分類,助力機(jī)器學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!