1. 程式人生 > 實用技巧 >第三章 線性迴歸

第三章 線性迴歸

第三章 線性迴歸

3.1 問題引入

線性迴歸就是使用曲線(直線,真曲線)來擬合數據點,進而得到資料中因變數與自變數的關係達到預測的目的。是值到值得預測。

import numpy as np
#生成20個點
x = np.linspace(0,10,20)
#對映為2緯資料關係
y = np.array(3 * x + 1)
#設定噪音
noise = np.random.randint(-1,1,20)
#列印散點圖
plt.scatter(x,y + noise)
plt.xlabel('x')
plt.ylabel('y')
plt.savefig('linspace')
plt.show()

上圖表示了一批線性分佈資料,而機器學習要做的如下圖。

紅色直線就是線性迴歸的擬合效果。

3.2 線性迴歸模型

3.2.1 模型建立

線性迴歸模型,其實是兩種模型中的判別式。因為我們知道判別式模型就是使用公式或者概率來直接輸出做預測的模型。

線性迴歸模型的種類一般為,一元線性迴歸;多元線性迴歸這都屬於一次的;還可以有各種曲線迴歸都行。

函式式,也叫假設空間:

H(x) = W X + b

這裡的W是權重向量,X表示樣本資料,b是偏置項。這裡W的維度與X的特徵數相同,點積求和操作。

有了假設空間也就是模型之後我們考慮機器學習三要素,還要有策略和演算法。結合迴歸模型,我們選取的策略也就是損失函式一般是均方差,然後演算法也就是優化方法選擇得是梯度下降。這裡涉及經驗風險的最優化問題與梯度下降,都是數學中的鏈式法則求解。可以查閱相關知識手推一下。

3.2.2 線性迴歸建模流程

  1. 確定輸入輸出

  2. 選擇合適的迴歸模型

  3. 初始化權重和偏置

  4. 在訓練集中隨機選取資料進行模型更新

  5. 迭代訓練

3.3 使用sklearn實現線性迴歸

#匯入繪圖模組
import matplotlib.pyplot as plt
#匯入波士頓資料集,sklearn庫的datasets模組內涵很多已有資料集
from sklearn.datasets import load_boston
#匯入線性迴歸模型,傳統LR模型,Laaao迴歸模型,Ridge迴歸模型,ElasticNet迴歸哦行
from sklearn.linear_model import
LinearRegression,Lasso,Ridge,ElasticNet #匯入資料標準化模組 from sklearn import preprocessing #匯入劃分資料集模組,也可以自己切片劃分 from sklearn.model_selection import train_test_split ​ #匯入資料 data = load_boston() #輸出資料維度 print(data.data.shape) #輸出資料 print(data.data) #輸出資料標籤 print(data.target) ​ #劃分測試集雨驗證集,data.data是X,data.target是標籤Y,test_size是測試集比例 train_x,test_x,train_y,test_y = train_test_split(data.data,data.target,test_size=0.2) #檢視劃分維度是否對齊 print(train_x.shape,train_y.shape) print(test_x.shape,test_y.shape) ​ #資料標準化 #匯入資料標準化方法,歸一化 scaler = preprocessing.StandardScaler() #注意標籤是不用歸一化的 train_x_scaler = scaler.fit_transform(train_x) test_x_scaler = scaler.fit_transform(test_x) #檢視歸一化效果 print(test_x_scaler[0:10]) ​ #模型訓練 #使用最簡單的模型訓練 model_lr = LinearRegression().fit(train_x_scaler,train_y) ​ #模型測試 y_pred_lr = model_lr.predict(test_x_scaler) ​ #評估預測 print("訓練集:", model_lr.score(train_x_scaler, train_y)) print("測試集:", model_lr.score(test_x_scaler, test_y)) print('權重引數',model_lr.coef_) print('偏置引數 ',model_lr.intercept_) ​ #模型儲存 import joblib joblib.dumb(model_lr,file_path)

輸出: 訓練集:
0.7350117186188968 測試集: 0.756913836466261 權重引數 [-0.98513255 0.90956824 0.23210287 0.80325878 -2.33112162 2.69152887 0.07504261 -3.22294653 2.69543339 -1.95646929 -2.01850215 0.84922147 -3.90754852] 偏置引數 22.651980198019814

這裡使用的是最簡單的線性迴歸方程,也沒有調整引數。有興趣的可以試試其他模型的效果。

線性迴歸模型對應的是linear_model.LinearRegression類;除此之外,還有基於L1正則化的Lasso迴歸(Lasso Regression),基於L2正則化的線性迴歸(Ridge Regression),以及基於L1和L2正則化融合的Lasso CNet迴歸(ElasticNetRegression)