四、邏輯回歸
6、邏輯回歸實現二分類
(1)對於每個樣本x利用線性回歸模型得到輸出z:
(2)將線性回歸模型的輸出z利用sigmoid函數得到概率:
(3)構造損失函數:
(4)損失函數關於向量W=( w0 , ... , wd )的函數,求損失函數的梯度:
由於:
所以:
由於:
所以:
由於: ,
所以:
寫成矩陣的形式:
其中X為m×(d+1)的樣本矩陣,Y為m維的樣本類別矩陣,P為m維的概率矩陣。
利用梯度下降修改參數ŵ:
(5)代碼實現
#===========1、邏輯回歸模擬=========== import numpy as np import pandas as pd import matplotlib.pyplot as plt #************sigmoid函數計算********* def sigmoid(z): return 1/(1+np.exp(-z)) #***********利用迭代方法求最優的w******* def mymodel(X,Y,eta,W,iters): i=1 while (i<=iters): err = sigmoid(np.dot(X,W))-Y gradient = np.dot(X.T,err) W=W-eta*gradient i=i+1 return W #***********讀取數據******************* df = pd.read_csv('ex1.csv',header=None) data = df.values X = data[:,:-1] Y = data[:,-1].reshape((-1,1)) #**********構造增廣矩陣**************** ones = np.ones((X.shape[0],1)) X = np.hstack((ones,X)) #*********模型初始化****************** W = np.ones((X.shape[1],1)) eta = 0.001 #*********調用模型,求最優解********** W = mymodel(X,Y,eta,W,500) #*********繪制正例和負例************* xcord1 = []; ycord1 = [] xcord2 = []; ycord2 = [] for i in range(X.shape[0]): if int(Y[i])==1: xcord1.append(X[i,1]) ycord1.append(X[i,2]) else: xcord2.append(X[i,1]) ycord2.append(X[i,2]) plt.scatter(xcord1,ycord1,s = 20, c = 'red', marker = 's',alpha=.5) plt.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5) #*********繪制決策邊界************ x_w = np.linspace(-3,3,100) y_w = (-W[0]-W[1]*x_w)/W[2] print(W) plt.plot(x_w,y_w,c='blue') plt.show()
LogisticRegression
LogisticRegression中默認實現了 OVR ,因此LogisticRegression
可以實現多分類。
LogisticRegression
的構造函數中有三個常用的參數可以設置:
-
solver
:{'newton-cg' , 'lbfgs', 'liblinear', 'sag', 'saga'}
, 分別為幾種優化算法。默認為liblinear
; -
C
:正則化系數的倒數,默認為 1.0 ,越小代表正則化越強; -
max_iter
:最大訓練輪數,默認為 100 。
和sklearn
中其他分類器一樣,LogisticRegression
類中的fit
函數用於訓練模型,fit
函數有兩個向量輸入:
-
X
:大小為 [樣本數量,特征數量] 的ndarray
,存放訓練樣本; -
Y
:值為整型,大小為 [樣本數量] 的ndarray
,存放訓練樣本的分類標簽。
LogisticRegression
類中的predict
函數用於預測,返回預測標簽,predict
函數有一個向量輸入:
X
:大小為[樣本數量,特征數量]的ndarray
,存放預測樣本。
LogisticRegression
的使用代碼如下:
logreg = LogisticRegression(solver='lbfgs',max_iter =10,C=10) logreg.fit(X_train, Y_train) result = logreg.predict(X_test)
#=======2、利用sklearn中logisticregression函數========= import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,\ roc_auc_score,confusion_matrix,classification_report filename = 'pima_data.csv' names = ['preg','plas','blood','skin','insulin','bmi','pedi','age','class'] data = pd.read_csv(filename,names=names) array = data.values X=array[:,:-1] Y=array[:,-1] test_size = 0.3 seed = 4 X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=test_size,random_state=seed) model = LogisticRegression() model.fit(X_train,Y_train) y_predict = model.predict(X_test) y_proba = model.predict_proba(X_test)[:,1] y_true = Y_test print(accuracy_score(y_true,y_predict)) print(y_proba) print(y_predict)
7、多分類學習
拆解法:將一個多分類任務拆分為若干個二分類任務求解。
8、糾錯輸出碼(ECOC)
多對多(Many vs Many, MvM): 將若干類作為正類,若干類作為反類。
一種常見方法:糾錯輸出碼 (Error Correcting Output Code)
ECOC編碼對分類器錯誤有一定容忍和修正能力,編碼越長、糾錯能力越強。
對同等長度的編碼,理論上來說,任意兩個類別之間的編碼距離越遠,則糾錯能力越強。
根據多個分類器的分類結果綜合判斷,其中一個分類器出錯不會影響全局判斷,編碼越長,糾錯能力越強。編碼不同的位數。