
使用這些基本 REST API 最佳實踐構建出色的 API
實現多標簽分類算法有DNN、KNN、ML-DT、Rank-SVM、CML,像決策樹DT、最近鄰KNN這一類模型,從原理上面天然可調整適應多標簽任務的(多標簽適應法),如按同一劃分/近鄰的客群中各標簽的占比什么的做下排序就可以做到了多標簽分類。這部電影10個近鄰里面有5部是動作片,3部是科幻片,可以簡單給這部電影至少打個【科幻、動作】。
這里著重介紹下,比較通用的多標簽實現思路,大致有以下4種:
簡單粗暴,直接把不同標簽組合當作一個類別,作為一個多分類任務來學習。如上述 【科幻、動作】、【動作、愛情、諜戰】、【科幻、愛情】就可以看作一個三分類任務。這種方法前提是標簽組合是比較有限的,不然標簽會非常稀疏沒啥用。
也挺簡單的。將多標簽問題轉成多個二分類模型預測的任務。如電影總的子標簽有K個,劃分出K份數據,分別訓練K個二分類模型,【是否科幻類、是否動作類….第K類】,對于每個樣本預測K次打出最終的標簽組合。
這種方法簡單靈活,但是缺點是也很明顯,各子標簽間的學習都是獨立的(可能是否科幻類對判定是否動作類的是有影響),忽略了子標簽間的聯系,丟失了很多信息。
對應的方法有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)
在方法二的基礎上進行改良,即考慮標簽之間的關系。每一個分類器的預測結果將作為一個數據特征傳給下一個分類器,參與進行下一個類別的預測。該方法的缺點是分類器之間的順序會對模型性能產生巨大影響。
這以與多分類方法類似,但不同的是這里神經網絡的多個輸出,輸出層由多個的sigmoid+交叉熵組成,并不是像softmax各輸出是互斥的。
如下構建一個輸出為3個標簽的概率的多標簽模型,模型是共用一套神經網絡參數,各輸出的是獨立(bernoulli分布)的3個標簽概率
## 多標簽 分類
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特征,y為多個標簽
model.fit(x, y.loc[:,['LABEL','LABEL1','LABEL3']], epochs=3)
通過共享的模型參數來完成多標簽分類任務,在考慮了標簽間的聯系的同時,共享網絡參數可以起著模型正則化的作用,可能對提高模型的泛化能力有所幫助的(在個人驗證中,測試集的auc漲了1%左右)。這一點和多任務學習是比較有聯系的,等后面有空再好好研究下多任務。
文章轉自微信公眾號@算法進階