三、線性回歸
5、線性回歸訓練流程
線性回歸模型訓練流程如下:
6、線性回歸的正規方程解
對線性回歸模型,假設訓練集中 m
個訓練樣本,每個訓練樣本中有 n
個特征,可以使用矩陣的表示方法,預測函數可以寫為:
Y = hetaX
其損失函數可以表示為:
其中,標簽 Y
為 mx1
的矩陣,訓練特征 X
為 mx(n+1)
的矩陣,回歸系數 heta為(n+1)x1
的矩陣,對 heta求導,並令其導數等於0
,可以得到
所以,最優解為:
這個就是正規方程解,我們可以通過最優方程解直接求得我們所需要的參數。
7、線性回歸模擬
import numpy as np import pandas as pd import matplotlib.pyplot as plt #*************讀取某數據集************** df = pd.read_csv("ex0_1.csv",header=None) data = df.values X=data[:,0].reshape((-1,1)) Y=data[:,1].reshape((-1,1)) plt.scatter(X,Y) x_min = min(X) x_max = max(X) #*************構造增廣矩陣*************** ones=np.ones((X.shape[0],1)) X=np.hstack((ones,X)) #************結束*********************** #***********求解正規方程解************** XT=X.T XTX=np.dot(XT,X) XTX_1=np.linalg.inv(XTX) XTX_1XT=np.dot(XTX_1,XT) W=np.dot(XTX_1XT,Y) #**********結束********************** #*********繪制擬合的直線************ x_w = np.linspace(x_min,x_max,100) x_w = x_w.reshape((-1,1)) ones = np.ones((x_w.shape[0],1)) x_w = np.hstack((ones,x_w)) y_w = np.dot(x_w,W) plt.plot(x_w[:,1],y_w) plt.show()
8、實例講解—波斯頓房價預測
(1)數據集介紹
波斯頓房價數據集共有506
條波斯頓房價的數據,每條數據包括對指定房屋的13
項數值型特征和目標房價組成。用數據集的80%
作為訓練集,數據集的20%
作為測試集,訓練集和測試集中都包括特征和目標房價。
sklearn
中已經提供了波斯頓房價數據集的相關接口,想要使用該數據集可以使用如下代碼:
from sklearn import datasets #加載波斯頓房價數據集 boston = datasets.load_boston() #X表示特征,y表示目標房價 X = boston.data y = boston.target
數據集中部分數據與標簽如下圖所示:
(2)線性回歸訓練流程
由數據集可以知道,每一個樣本有13
個特征與目標房價,而我們要做的事就是通過這13
個特征來預測房價,我們可以構建一個多元線性回歸模型,來對房價進行預測。模型如下:
y = b + w1x1 + w2x2 + ... + wnxn
其中xi表示第i
個特征值,wi表示第i
個特征對應的權重,b
表示偏置,y
表示目標房價。
為了方便,我們稍微將模型進行變換:
y = w0x0 + w1x1 + w2x2 + ... + wnxn
其中x0等於1
。
Y = heta.X
heta = ( w0 , w1 , ... , wn )
X = ( 1 , x1 , ... , xn )
而我們的目的就是找出能夠正確預測的多元線性回歸模型,即找出正確的參數 heta。
那么如何尋找呢?通常在監督學習里面都會使用這么一個套路,構造一個損失函數,用來衡量真實值與預測值之間的差異,然后將問題轉化為最優化損失函數。既然損失函數是用來衡量真實值與預測值之間的差異那么很多人自然而然的想到了用所有真實值與預測值的差的絕對值來表示損失函數。不過帶絕對值的函數不容易求導,所以采用MSE
(均方誤差)作為損失函數,公式如下:
其中 p 表示預測值,y 表示真實值,m 為樣本總個數,i 表示第 i 個樣本。
最后,我們再使用正規方程解來求得我們所需要的參數。
(3)代碼實現流程
1、數據讀取
from sklearn import datasets boston = datasets.load_boston() X = boston['data'] Y = boston['target']
2、數據預處理
from sklearn import preprocessing min_max_scaler = preprocessing.MinMaxScaler() X = min_max_scaler.fit_transform(X)
3、將數據集分為訓練集和測試集
from sklearn.model_selection import train_test_split test_size = 0.2 seed = 7 X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=test_size,random_state=seed)
4、調用線性模型,得到W
5、房價預測:X_test*W,利用sklearn提供的模型LinearRegression預測房價
LinearRegression
的構造函數中有兩個常用的參數可以設置:
(1)fit_intercept
:是否有截據,如果沒有則直線過原點,默認為Ture
。
(2)normalize
:是否將數據歸一化,默認為False
。
LinearRegression
類中的fit
函數用於訓練模型,fit
函數有兩個向量輸入:
(1)X
:大小為[樣本數量,特征數量]的ndarray
,存放訓練樣本
(2)Y
:值為整型,大小為[樣本數量]的ndarray
,存放訓練樣本的標簽值
LinearRegression
類中的predict
函數用於預測,返回預測值,predict
函數有一個向量輸入:
X
:大小為[樣本數量,特征數量]的ndarray
,存放預測樣本
LinearRegression
的使用代碼如下:
from sklearn.linear_model import LinearRegression LinearRegression() lr = LinearRegression() #訓練模型 lr.fit(X_train,Y_train) #獲取預測標簽 y_pred = lr.predict(X_test)
(4)具體代碼實現
#============1、線性回歸方法用於波士頓房價預測========= import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn import preprocessing #***********該函數用於求解正規方程解**************** def mylinearmodel(X,Y): ones=np.ones((X.shape[0],1)) X=np.hstack((ones,X)) XT=X.T XTX=np.dot(XT,X) XTX_1=np.linalg.inv(XTX) XTX_1XT=np.dot(XTX_1,XT) W=np.dot(XTX_1XT,Y) return W #**************均方誤差************** def mse(y_predict,y_test): mse = np.mean((y_predict-y_test)**2) return mse #*************決定系數**************** def r2_score(y_predict,y_test): r2 = 1-mse(y_predict,y_test)/np.var(y_test) return r2 #***********預測房價***************** def prediction(X,W): ones=np.ones((X.shape[0],1)) X=np.hstack((ones,X)) y_predict=np.dot(X,W) return y_predict #**********讀取數據****************** boston = datasets.load_boston() X = boston['data'] Y = boston['target'] #**********數據預處理-歸一化********* min_max_scaler = preprocessing.MinMaxScaler() X=min_max_scaler.fit_transform(X) test_size = 0.2 seed = 7 X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=test_size,random_state=seed) W = mylinearmodel(X_train,Y_train) y_predict = prediction(X_test,W) loss = r2_score(y_predict,Y_test) print(loss) #=======2、利用sklearn中的Lineargression函數預測房價========= import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score lr = LinearRegression() lr.fit(X_train,Y_train) y_pred = lr.predict(X_test) loss = r2_score(Y_test,y_pred) print(loss)
(5)scikit-learn線性回歸實踐 - 波斯頓房價預測(簡化版本)
要求:使用sklearn
構建線性回歸模型,利用訓練集數據與訓練標簽對模型進行訓練,然后使用訓練好的模型對測試集數據進行預測,並將預測結果保存到./step3/result.csv
中。
實現流程:需要調用 sklearn
中的線性回歸模型,並通過波斯頓房價數據集中房價的13
種屬性與目標房價對線性回歸模型進行訓練。調用訓練好的線性回歸模型,來對房價進行預測。
#encoding=utf8 mport numpy as np import pandas as pd from sklearn.linear_model import LinearRegression #獲取訓練數據 train_data = pd.read_csv('./step3/train_data.csv') #獲取訓練標簽 train_label = pd.read_csv('./step3/train_label.csv') train_label = train_label['target'] #獲取測試數據 test_data = pd.read_csv('./step3/test_data.csv') lr = LinearRegression() #訓練模型 lr.fit(train_data,train_label) #獲取預測標簽 predict = lr.predict(test_data) #將預測標簽寫入csv df = pd.DataFrame({'result':predict}) df.to_csv("./step3/result.csv",index=False)