【筆記】二分類算法解決多分類問題之OvO與OvR


OvO與OvR

前文書道,邏輯回歸只能解決二分類問題,不過,可以對其進行改進,使其同樣可以用於多分類問題,其改造方式可以對多種算法(幾乎全部二分類算法)進行改造,其有兩種,簡寫為OvO與OvR

OvR

one vs rest,即一對剩余所有,如字面意思,有的時候稱為OvA,one vs all

假設有四個類別,對於這種分類問題,可以將一個類別選中以后,使其他三個類別合並為一個類別,即其它類別,這樣就換變為二分類問題了,這種可以形成四種情況,選擇預測概率高的,也就是說,有n個類別就進行n次分類,然后選擇分類得分最高的,這樣復雜度會上升很多,時間消耗會增加

OvO

one vs one,即一對一,就是進行一對一的比較

假設有四個類別,每個類別只用一個點表示,每次只挑出兩個類別,然后進行二分類任務,四個任務可以形成六個情況,即排列組合的C的計算,然后看,對於這六個類別中,那個最好,即n個類別就進行C(n,2)次分類,選擇贏數最高的分類結果,很顯然,時間消耗的更多,但是分類結果更准

具體實現

(在notebook中)

使用鳶尾花的數據集,先只使用部分數據(兩個維度),設置好以后,將數據集進行分割

  import numpy as np
  import matplotlib.pyplot as plt
  from sklearn import datasets

  iris = datasets.load_iris()
  X = iris.data[:,:2]
  y = iris.target

  from sklearn.model_selection import train_test_split

  X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)

使用sklearn中的邏輯回歸,使用ovr方式,因為ovo是默認情況,要使用ovr的話,需要設置multi_class為ovr,然后設置solver為liblinear

  from sklearn.linear_model import LogisticRegression
  #ovo是默認了
  log_reg = LogisticRegression(multi_class='ovr',solver='liblinear')
  log_reg.fit(X_train,y_train)

測試數據集的預測結果為

繪制函數:

  from matplotlib.colors import ListedColormap
  def plot_decision_boundary(model, axis):

      x0,x1 = np.meshgrid(  
          np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),
          np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1)
      )
      X_new = np.c_[x0.ravel(),x1.ravel()]
      y_predict = model.predict(X_new)
      zz = y_predict.reshape(x0.shape)
      custom_cmap = ListedColormap(['#EF9A9A', '#FFF59D', '#90CAF9'])

      plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)

繪制決策邊界

  plot_decision_boundary(log_reg,axis=[4,8.5,1.5,4.5])
  plt.scatter(X[y==0,0],X[y==0,1])
  plt.scatter(X[y==1,0],X[y==1,1])
  plt.scatter(X[y==2,0],X[y==2,1])

圖像為

使用ovo的方法,可以將multi_class設置為multinomial,再設置solver為newton-cg,也可以默認,不用設置也可以

  log_reg2 = LogisticRegression(multi_class="multinomial",solver="newton-cg")
  log_reg2.fit(X_train,y_train)

訓練數據集的預測結果為

繪制決策邊界

  plot_decision_boundary(log_reg2,axis=[4,8.5,1.5,4.5])
  plt.scatter(X[y==0,0],X[y==0,1])
  plt.scatter(X[y==1,0],X[y==1,1])
  plt.scatter(X[y==2,0],X[y==2,1])

圖像為

使用全部數據,重新進行數據集分割,首先是使用ovr的方法

  X = iris.data
  y = iris.target

  X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)

  log_reg = LogisticRegression(multi_class='ovr',solver='liblinear')
  log_reg.fit(X_train,y_train)
  log_reg.score(X_test,y_test)

此時輸出的結果為

然后是使用ovo的方法

  log_reg2 = LogisticRegression(multi_class="multinomial",solver="newton-cg")
  log_reg2.fit(X_train,y_train)
  log_reg2.score(X_test,y_test)

輸出結果為

使用sklearn中的ovr

使用和前面的一樣

  from sklearn.multiclass import OneVsRestClassifier

  ovr = OneVsRestClassifier(log_reg)
  ovr.fit(X_train,y_train)
  ovr.score(X_test,y_test)

輸出結果為

使用sklearn中的ovo

  from sklearn.multiclass import OneVsOneClassifier

  ovo = OneVsOneClassifier(log_reg)
  ovo.fit(X_train,y_train)
  ovo.score(X_test,y_test)

輸出結果為

以上就是OvO與OvR


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM