sklearn实现多分类逻辑回归
#二分类逻辑回归算法改造适用于多分类问题
1、对于逻辑回归算法主要是用回归的算法解决分类的问题,它只能解决二分类的问题,不过经过一定的改造便可以进行多分类问题,主要的改造方式有两大类:(1)OVR/A(One VS Rest/ALL)(2)OVO(One VS One)2、对于OVR的改造方式,主要是指将多个分类结果(假设为n)分成是其中一种分类结果的和(其他),这样便可以有n种分类的模型进行训练,最终选择得分最高的的(预测率最高的的)便为分类结果即可。它所训练的时间是原来分类时间的n倍
图1
3、对于OVO的方式,主要是将n个数据分类结果任意两个进行组合,然后对其单独进行训练和预测,最终在所有的预测种类中比较其赢数最高的即为分类结果,这样的分类方式最终将训练分为n(n-1)/2个模型,计算时间相对较长,不过这样的方式每次训练各个种类之间不混淆也不影响,因此比较准确。图2
4、sklearn中含有将逻辑回归进行多分类的函数封装,可以直接进行调用,当然也可以自己进行底层实现,都是比较方便的。在sklearn中实现逻辑回归的多分类任务具体实现代码如下所示:#OVR-OVO改造二分类算法实现多分类方式 import numpy as np import matplotlib.pyplot as plt 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_pre=model.predict(x_new) zz=y_pre.reshape(x0.shape) from matplotlib.colors import ListedColormap cus=ListedColormap(["#EF9A9A","#FFF59D","#90CAF9"]) plt.contourf(x0,x1,zz,cmap=cus) #采用iris数据集的两个数据特征进行模型训练与验证 from sklearn import datasets d=datasets.load_iris() x=d.data[:,:2] #选取特征数据集的前两个数据特征,方便输出决策出边界进行训练结果的对比 y=d.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) from sklearn.linear_model import LogisticRegression #OVR方式的调用-默认方式 log_reg=LogisticRegression() #不输入参数时,默认情况下是OVR方式 log_reg.fit(x_train,y_train) print(log_reg.score(x_test,y_test)) plot_decision_boundary(log_reg,axis=[4,9,1,5]) plt.scatter(x[y==0,0],x[y==0,1],color="r") plt.scatter(x[y==1,0],x[y==1,1],color="g") plt.scatter(x[y==2,0],x[y==2,1],color="b") plt.show() #OVO的方式进行逻辑回归函数参数的定义,结果明显好于OVR方式 log_reg1=LogisticRegression(multi_class="multinomial",solver="newton-cg") log_reg1.fit(x_train,y_train) print(log_reg1.score(x_test,y_test)) plot_decision_boundary(log_reg1,axis=[4,9,1,5]) plt.scatter(x[y==0,0],x[y==0,1],color="r") plt.scatter(x[y==1,0],x[y==1,1],color="g") plt.scatter(x[y==2,0],x[y==2,1],color="b") plt.show() #采用iris数据的所有特征数据 x=d.data y=d.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) from sklearn.linear_model import LogisticRegression #OVR方式的调用-默认胡方式 log_reg=LogisticRegression() #不输入参数时,默认情况下是OVR方式 log_reg.fit(x_train,y_train) print(log_reg.score(x_test,y_test)) #采用OVO的方式进行逻辑回归函数参数的定义,结果明显好于OVR方式 log_reg1=LogisticRegression(multi_class="multinomial",solver="newton-cg") log_reg1.fit(x_train,y_train) print(log_reg1.score(x_test,y_test)) 实现结果如下所示: