1. 程式人生 > >Bobo老師機器學習筆記第九課-如何處理多分類任務?

Bobo老師機器學習筆記第九課-如何處理多分類任務?

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、初始化這兩個分類器的時候需要傳入分類的模型。

 

參考文章:

one-vs-rest與one-vs-one以及sklearn的實現

多分類和多標籤演算法