二、多標(biāo)簽分類實現(xiàn)

實現(xiàn)多標(biāo)簽分類算法有DNN、KNN、ML-DT、Rank-SVM、CML,像決策樹DT、最近鄰KNN這一類模型,從原理上面天然可調(diào)整適應(yīng)多標(biāo)簽任務(wù)的(多標(biāo)簽適應(yīng)法),如按同一劃分/近鄰的客群中各標(biāo)簽的占比什么的做下排序就可以做到了多標(biāo)簽分類。這部電影10個近鄰里面有5部是動作片,3部是科幻片,可以簡單給這部電影至少打個【科幻、動作】。

這里著重介紹下,比較通用的多標(biāo)簽實現(xiàn)思路,大致有以下4種:

方法一:多分類思路

簡單粗暴,直接把不同標(biāo)簽組合當(dāng)作一個類別,作為一個多分類任務(wù)來學(xué)習(xí)。如上述 【科幻、動作】、【動作、愛情、諜戰(zhàn)】、【科幻、愛情】就可以看作一個三分類任務(wù)。這種方法前提是標(biāo)簽組合是比較有限的,不然標(biāo)簽會非常稀疏沒啥用。

方法二:OVR二分類思路

也挺簡單的。將多標(biāo)簽問題轉(zhuǎn)成多個二分類模型預(yù)測的任務(wù)。如電影總的子標(biāo)簽有K個,劃分出K份數(shù)據(jù),分別訓(xùn)練K個二分類模型,【是否科幻類、是否動作類….第K類】,對于每個樣本預(yù)測K次打出最終的標(biāo)簽組合。

這種方法簡單靈活,但是缺點是也很明顯,各子標(biāo)簽間的學(xué)習(xí)都是獨立的(可能是否科幻類對判定是否動作類的是有影響),忽略了子標(biāo)簽間的聯(lián)系,丟失了很多信息。

對應(yīng)的方法有sklearn的OneVsRestClassifier方法,

from xgboost import XGBClassifier
from sklearn.multiclass import OneVsRestClassifier
import numpy as np

clf_multilabel = OneVsRestClassifier(XGBClassifier())

train_data = np.random.rand(500, 100) # 500 entities, each contains 100 features
train_label = np.random.randint(2, size=(500,20)) # 20 targets

val_data = np.random.rand(100, 100)

clf_multilabel.fit(train_data,train_label)
val_pred = clf_multilabel.predict(val_data)

方法三:二分類改良

在方法二的基礎(chǔ)上進行改良,即考慮標(biāo)簽之間的關(guān)系。每一個分類器的預(yù)測結(jié)果將作為一個數(shù)據(jù)特征傳給下一個分類器,參與進行下一個類別的預(yù)測。該方法的缺點是分類器之間的順序會對模型性能產(chǎn)生巨大影響。

方法四:多個輸出的神經(jīng)網(wǎng)絡(luò)

這以與多分類方法類似,但不同的是這里神經(jīng)網(wǎng)絡(luò)的多個輸出,輸出層由多個的sigmoid+交叉熵組成,并不是像softmax各輸出是互斥的。

如下構(gòu)建一個輸出為3個標(biāo)簽的概率的多標(biāo)簽?zāi)P?,模型是共用一?a href="http://cnzze.cn/wiki/what-is-neural-networks/">神經(jīng)網(wǎng)絡(luò)參數(shù),各輸出的是獨立(bernoulli分布)的3個標(biāo)簽概率

## 多標(biāo)簽 分類
from keras.models import Model
from keras.layers import Input,Dense

inputs = Input(shape=(15,))
hidden = Dense(units=10,activation='relu')(inputs)
output = Dense(units=3,activation='sigmoid')(hidden)
model=Model(inputs=inputs, outputs=output)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()

# 訓(xùn)練模型,x特征,y為多個標(biāo)簽
model.fit(x, y.loc[:,['LABEL','LABEL1','LABEL3']], epochs=3)

通過共享的模型參數(shù)來完成多標(biāo)簽分類任務(wù),在考慮了標(biāo)簽間的聯(lián)系的同時,共享網(wǎng)絡(luò)參數(shù)可以起著模型正則化的作用,可能對提高模型的泛化能力有所幫助的(在個人驗證中,測試集的auc漲了1%左右)。這一點和多任務(wù)學(xué)習(xí)是比較有聯(lián)系的,等后面有空再好好研究下多任務(wù)。

文章轉(zhuǎn)自微信公眾號@算法進階

上一篇:

10個解釋AI決策的Python庫

下一篇:

神經(jīng)網(wǎng)絡(luò)與傅立葉變換有何關(guān)系?
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費