機器學習之線性回歸


回歸是統計學中最有力的工具之一。機器學習監督學習算法分為分類算法和回歸算法兩種,其實就是根據類別標簽分布類型為離散型、連續性而定義的。回歸算法用於連續型分布預測,針對的是數值型的樣本,使用回歸,可以在給定輸入的時候預測出一個數值,這是對分類方法的提升,因為這樣可以預測連續型數據而不僅僅是離散的類別標簽。

回歸分析中,只包括一個自變量和一個因變量,且二者的關系可用一條直線近似表示,這種回歸分析稱為一元線性回歸分析。

如果回歸分析中包括兩個或兩個以上的自變量,且因變量和自變量之間是線性關系,則稱為多元線性回歸分析。

因此線性回歸可以被定義為:通過一個或者多個自變量與因變量之間進行建模的回歸分析。

 

 

 比如預測房子價格,可以通過房子的面積一個變量來預測,也可以根據面積和位置來預測。

 

 

 

從上面兩張圖種可以看出,無論怎么構建這個回歸模型,總會存在誤差,也就是說總會有一些點沒有落在建立的線或者面上面。真實值與預測值之間的差距就叫做誤差大小,也叫做損失函數

而我們建立回歸模型的目的之一,就是盡可能的將這個損失函數的值降到最低,也就是要找到最佳的權重w。

 

 

 尋找最佳的權重w,有兩種方法:

第一:正規方程

 

 

 第二:梯度下降

 

 

 

 

 

 

 

 -------------------------------------------------------------------------------------------------------------------

正規方程API:sklearn.linear_model.LinearRegression

  • coef_:是最優的回歸系數

梯度下降API:sklearn.linear_model.SGDRegressor

  •  coef_:是最優的回歸系數

 

以波士頓房價數據預測為例:

 

 因為變量都涉及到一個權重,所以需要對每一個變量都要進行數據標准化處理,否則會出現 “大數吃小數” 現象。

了解一下數據集:

 

 

上代碼(正規方程):

 1 from sklearn.datasets import load_boston
 2 from sklearn.linear_model import LinearRegression,SGDRegressor
 3 from sklearn.model_selection import train_test_split
 4 from sklearn.preprocessing import StandardScaler
 5 
 6 def myliner():
 7     '''
 8     線性回歸直接預測房子價格
 9     :return: None
10     '''
11     #獲取數據
12     lb = load_boston()
13     print(lb.get('feature_names'))
14 
15     #分割數據集到訓練集和測試集
16     x_train, x_test, y_train, y_test = train_test_split(lb.data,lb.target,test_size=0.25)
17 
18     #進行標准化處理
19     #特征值和目標值都必須進行標准化處理,實例化兩個標准化API
20 
21     # 特征值
22     std_x = StandardScaler()
23     x_train = std_x.fit_transform(x_train)
24     x_test = std_x.transform(x_test)
25 
26     #目標值
27     std_y = StandardScaler()
28     y_train = std_y.fit_transform(y_train.reshape(-1,1)) #sklearn0.19版本要求目標值必須為二維向量,因此這里需要轉換為二維的
29     y_test = std_y.transform(y_test.reshape(-1,1))
30 
31     #estimator預測
32     lr = LinearRegression()
33     lr.fit(x_train,y_train)
34 
35     print('權重矩陣為:',lr.coef_)
36 
37     #預測測試集的房子價格
38     y_predict = lr.predict(x_test)
39     print('測試機里面每個房子的預測價格:',y_predict)
40 
41     return None
42 
43 
44 if __name__ == '__main__':
45     myliner()

結果(正規方程):

 

 

上代碼(梯度下降):

 1 from sklearn.datasets import load_boston
 2 from sklearn.linear_model import LinearRegression,SGDRegressor
 3 from sklearn.model_selection import train_test_split
 4 from sklearn.preprocessing import StandardScaler
 5 
 6 def myliner():
 7     '''
 8     線性回歸直接預測房子價格
 9     :return: None
10     '''
11     #獲取數據
12     lb = load_boston()
13     print(lb.get('feature_names'))
14 
15     #分割數據集到訓練集和測試集
16     x_train, x_test, y_train, y_test = train_test_split(lb.data,lb.target,test_size=0.25)
17 
18     #進行標准化處理
19     #特征值和目標值都必須進行標准化處理,實例化兩個標准化API
20 
21     # 特征值
22     std_x = StandardScaler()
23     x_train = std_x.fit_transform(x_train)
24     x_test = std_x.transform(x_test)
25 
26     #目標值
27     std_y = StandardScaler()
28     y_train = std_y.fit_transform(y_train.reshape(-1,1)) #sklearn0.19版本要求目標值必須為二維向量,因此這里需要轉換為二維的
29     y_test = std_y.transform(y_test.reshape(-1,1))
30 
31     #梯度下降進行房價預測
32     sgd = SGDRegressor()
33 
34     sgd.fit(x_train,y_train)
35     print("梯度下降的權重矩陣為:", sgd.coef_)
36     #預測測試集的房子價格
37     y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
38     print('測試集里面每個房子的預測價格:',y_sgd_predict)
39 
40     return None
41 
42 
43 if __name__ == '__main__':
44     myliner()

結果:

 

 

回歸性能的評估:

對於不同的類別預測,我們不能苛刻的要求回歸預測的數值結果要嚴格的與真實值相同。一般情況下,我們希望衡量預測值與真實值之間的差距。因此,可以測評函數進行評價。其中最為直觀的評價指標均方誤差(Mean Squared Error)MSE,因為這也是線性回歸模型所要優化的目標。MSE的計算方法如下:

 

 

 API:sklearn.metrics.mean_squared_error

 

 上代碼:

1 from sklearn.metrics import mean_squared_error
2 
3 print('正規方程的均方誤差:',mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))
4 
5 print('梯度下降的均方誤差:', mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))

結果:

 

 

從結果可以看出,雖然正規方程法的適用性比較小,但是在一些數據集的預測種其准確也有可能優於梯度下降。

一般來說,梯度下降法更適用於大數據集的預測。二者的組要區別如下:

 

 


免責聲明!

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



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