《機器學習(周志華)》筆記--線性模型(5)--邏輯回歸實現二分類、LogisticRegression、多分類學習、糾錯輸出碼(ECOC)


四、邏輯回歸

6、邏輯回歸實現二分類

  (1)對於每個樣本x利用線性回歸模型得到輸出z:

      

  (2)將線性回歸模型的輸出z利用sigmoid函數得到概率:

        

  (3)構造損失函數:

        

  (4)損失函數關於向量W=( w, ... , w)的函數,求損失函數的梯度:

              

      由於:   

      所以:

      由於: 

      所以:

      由於:   ,

      所以:

      

      寫成矩陣的形式:

            

         其中Xm×(d+1)的樣本矩陣,Ym維的樣本類別矩陣,Pm維的概率矩陣。

      利用梯度下降修改參數ŵ

                                      

  (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編碼對分類器錯誤有一定容忍和修正能力,編碼越長、糾錯能力越強。

  對同等長度的編碼,理論上來說,任意兩個類別之間的編碼距離越遠,則糾錯能力越強。

  根據多個分類器的分類結果綜合判斷,其中一個分類器出錯不會影響全局判斷,編碼越長,糾錯能力越強。編碼不同的位數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM