Bobo老師機器學習筆記第九課-如何處理多分類任務?
阿新 • • 發佈:2018-12-28
1、什麼是多分類任務?
針對多類問題的分類中,具體講有兩種,即multiclass classification和multilabel classification。
multiclass是指分類任務中包含不止一個類別時,每條資料僅僅對應其中一個類別,不會對應多個類別。
multilabel是指分類任務中不止一個分類時,每條資料可能對應不止一個類別標籤,例如一條新聞,可以被劃分到多個板塊。
無論是multiclass,還是multilabel,做分類時都有兩種策略,一個是one-vs-the-rest(one-vs-all),一個是one-vs-one。
簡稱就是OvR和OvO
2、OvR和OvO的原理是什麼?
OvR: 假設有n個類別,選擇其中一個作為1類,剩下的n-1作為一類。進行n次分類,選擇分類得分最高的。
OvO: 同樣假設有n個類別,則會針對兩兩類別建立二項分類器,得到k=n*(n-1)/2個分類器。 然後進行K次分類,選擇最高的;
通常來說,OvO耗時較多,但較為準確。
3、Sklearn中是如何實現多類別分類的?
在邏輯迴歸中,有個引數是:
multi_class : str, {‘ovr’, ‘multinomial’, ‘auto’}, default: ‘ovr’ 宣告是多類別分類。
log_reg2 = LogisticRegression(multi_class="multinomial", solver="newton-cg")
利用鳶尾花測試集:
X, y = datasets.load_iris(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666) log_reg2 = LogisticRegression(multi_class="multinomial", solver="newton-cg") log_reg2.fit(X_train, y_train) print log_reg2.score(X_test, y_test)
執行結果是1.0
此外,在Sklearn中,針對OvR和OvO專門封裝了分類器。
X, y = datasets.load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)
log_reg.score(X_test, y_test)
from sklearn.multiclass import OneVsRestClassifier
ovr = OneVsRestClassifier(log_reg)
ovr.fit(X_train, y_train)
print 'ovr:', ovr.score(X_test, y_test)
from sklearn.multiclass import OneVsOneClassifier
ovo = OneVsOneClassifier(log_reg)
ovo.fit(X_train, y_train)
ovo.score(X_test, y_test)
print 'ovo:', ovo.score(X_test, y_test)
分類結果:
ovr: 0.9473684210526315
ovo: 1.0
最後注意一下:
1、OneVsOneClassifier和OnevsRestClassifier都是在sklearn中的multiclass下面
2、初始化這兩個分類器的時候需要傳入分類的模型。
參考文章: