回歸是統計學中最有力的工具之一。機器學習監督學習算法分為分類算法和回歸算法兩種,其實就是根據類別標簽分布類型為離散型、連續性而定義的。回歸算法用於連續型分布預測,針對的是數值型的樣本,使用回歸,可以在給定輸入的時候預測出一個數值,這是對分類方法的提升,因為這樣可以預測連續型數據而不僅僅是離散的類別標簽。
回歸分析中,只包括一個自變量和一個因變量,且二者的關系可用一條直線近似表示,這種回歸分析稱為一元線性回歸分析。
如果回歸分析中包括兩個或兩個以上的自變量,且因變量和自變量之間是線性關系,則稱為多元線性回歸分析。
因此線性回歸可以被定義為:通過一個或者多個自變量與因變量之間進行建模的回歸分析。
比如預測房子價格,可以通過房子的面積一個變量來預測,也可以根據面積和位置來預測。
從上面兩張圖種可以看出,無論怎么構建這個回歸模型,總會存在誤差,也就是說總會有一些點沒有落在建立的線或者面上面。真實值與預測值之間的差距就叫做誤差大小,也叫做損失函數。
而我們建立回歸模型的目的之一,就是盡可能的將這個損失函數的值降到最低,也就是要找到最佳的權重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))
結果:
從結果可以看出,雖然正規方程法的適用性比較小,但是在一些數據集的預測種其准確也有可能優於梯度下降。
一般來說,梯度下降法更適用於大數據集的預測。二者的組要區別如下: