• 【笔记】二分类算法解决多分类问题之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

  • 相关阅读:
    [图解算法] 最短路径算法之 “Dijikstra”
    [前端随笔][CSS] 伪类的应用
    [前端随笔][JavaScript] 实现原生的事件监听<Vue原理>
    [图解算法] 最短路径算法之 “Floyd”
    [前端随笔][JavaScript][自制数据可视化] “中国地图”
    [前端随笔][JavaScript] 懒加载的实现(上划一次加载一部分)
    [前端随笔][CSS] 制作一个加载动画 即帖即用
    ThinkPHP下隐藏index.php以及URL伪静态
    PHP基础语法3
    PHP基础语法2
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/14321116.html
Copyright © 2020-2023  润新知