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))
實現結果如下所示: