日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

【笔记】二分类算法解决多分类问题之OvO与OvR

發(fā)布時(shí)間:2023/12/13 综合教程 21 生活家
生活随笔 收集整理的這篇文章主要介紹了 【笔记】二分类算法解决多分类问题之OvO与OvR 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

OvO與OvR

前文書(shū)道,邏輯回歸只能解決二分類(lèi)問(wèn)題,不過(guò),可以對(duì)其進(jìn)行改進(jìn),使其同樣可以用于多分類(lèi)問(wèn)題,其改造方式可以對(duì)多種算法(幾乎全部二分類(lèi)算法)進(jìn)行改造,其有兩種,簡(jiǎn)寫(xiě)為OvO與OvR

OvR

one vs rest,即一對(duì)剩余所有,如字面意思,有的時(shí)候稱(chēng)為OvA,one vs all

假設(shè)有四個(gè)類(lèi)別,對(duì)于這種分類(lèi)問(wèn)題,可以將一個(gè)類(lèi)別選中以后,使其他三個(gè)類(lèi)別合并為一個(gè)類(lèi)別,即其它類(lèi)別,這樣就換變?yōu)槎诸?lèi)問(wèn)題了,這種可以形成四種情況,選擇預(yù)測(cè)概率高的,也就是說(shuō),有n個(gè)類(lèi)別就進(jìn)行n次分類(lèi),然后選擇分類(lèi)得分最高的,這樣復(fù)雜度會(huì)上升很多,時(shí)間消耗會(huì)增加

OvO

one vs one,即一對(duì)一,就是進(jìn)行一對(duì)一的比較

假設(shè)有四個(gè)類(lèi)別,每個(gè)類(lèi)別只用一個(gè)點(diǎn)表示,每次只挑出兩個(gè)類(lèi)別,然后進(jìn)行二分類(lèi)任務(wù),四個(gè)任務(wù)可以形成六個(gè)情況,即排列組合的C的計(jì)算,然后看,對(duì)于這六個(gè)類(lèi)別中,那個(gè)最好,即n個(gè)類(lèi)別就進(jìn)行C(n,2)次分類(lèi),選擇贏數(shù)最高的分類(lèi)結(jié)果,很顯然,時(shí)間消耗的更多,但是分類(lèi)結(jié)果更準(zhǔn)

具體實(shí)現(xiàn)

(在notebook中)

使用鳶尾花的數(shù)據(jù)集,先只使用部分?jǐn)?shù)據(jù)(兩個(gè)維度),設(shè)置好以后,將數(shù)據(jù)集進(jìn)行分割

  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方式,因?yàn)閛vo是默認(rèn)情況,要使用ovr的話,需要設(shè)置multi_class為ovr,然后設(shè)置solver為liblinear

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

測(cè)試數(shù)據(jù)集的預(yù)測(cè)結(jié)果為

繪制函數(shù):

  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設(shè)置為multinomial,再設(shè)置solver為newton-cg,也可以默認(rèn),不用設(shè)置也可以

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

訓(xùn)練數(shù)據(jù)集的預(yù)測(cè)結(jié)果為

繪制決策邊界

  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])

圖像為

使用全部數(shù)據(jù),重新進(jìn)行數(shù)據(jù)集分割,首先是使用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)

此時(shí)輸出的結(jié)果為

然后是使用ovo的方法

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

輸出結(jié)果為

使用sklearn中的ovr

使用和前面的一樣

  from sklearn.multiclass import OneVsRestClassifier

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

輸出結(jié)果為

使用sklearn中的ovo

  from sklearn.multiclass import OneVsOneClassifier

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

輸出結(jié)果為

以上就是OvO與OvR

總結(jié)

以上是生活随笔為你收集整理的【笔记】二分类算法解决多分类问题之OvO与OvR的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。