一.理論基礎
1.迴歸公式 對於單元的線性迴歸,我們有:f(x) = kx + b 的方程(k代表權重,b代表截距)。 對於多元線性迴歸,我們有:
或者為了簡化,乾脆將b視為k0·x0,,其中k0為1,於是我們就有:
2.損失函式
3.誤差衡量MSE,RMSE,MAE越接近於0越好,R方越接近於1越好。
MSE平均平方誤差(mean squared error)
RMSE,是MSE的開根號 MAE平均絕對值誤差(mean absolute error)
R方
其中y_hat是預測值。
二.程式碼實現本次,我們將用iris資料集實現單元線性迴歸的機器學習,使用boston資料集實現多元線性迴歸的機器學習。在python中,單元線性迴歸與多元線性迴歸的操作完全一樣,這裡只是為了演示而將其一分為二。1.鳶尾花花瓣長度與寬度的線性迴歸
# 匯入鳶尾花資料集from sklearn.datasets import load_iris# 匯入用於分割訓練集和測試集的類from sklearn.model_selection import train_test_split# 匯入線性迴歸類from sklearn.linear_model import LinearRegressionimport numpy as npiris = load_iris()'''iris資料集的第三列是鳶尾花長度,第四列是鳶尾花寬度x和y就是自變數和因變數reshape(-1,1)就是將iris.data[:,3]由一維陣列轉置為二維陣列,以便於與iris.data[:,2]進行運算'''x,y = iris.data[:,2].reshape(-1,1),iris.data[:,3]lr = LinearRegression()'''train_test_split可以進行訓練集與測試集的拆分,返回值分別為訓練集的x,測試集的x,訓練集的y,測試集的y,分別賦值給x_train,x_test,y_train,y_test,test_size:測試集佔比random_state:選定隨機種子'''x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.25,random_state = 0)# 利用訓練集進行機器學習lr.fit(x_train,y_train)# 權重為lr.coef_# 截距為lr.intercept_# 運用訓練出來的模型得出測試集的預測值y_hat = lr.predict(x_test)# 比較測試集的y值與預測出來的y值的前5條資料print(y_train[:5])print(y_hat[:5])# 評價模型的準確性,用測試集來評價# 匯入分別用於求MSE,MAE和R方的包from sklearn.metrics import mean_squared_error,mean_absolute_error,r2_score# 求解MSEprint('MSE:',mean_squared_error(y_test,y_hat))# 求解RMSE,是MSE的開根號print('RMSE:',np.sqrt(mean_squared_error(y_test,y_hat))# 求解MAEprint('MAE:',mean_absolute_error(y_test,y_hat))# 求解R方,有兩種方法,注意lr.score的引數是x_test,y_testprint('R方:',r2_score(y_test,y_hat))print('R方:',lr.score(x_test,y_test))# 匯入matplotlib模組,進行視覺化from matplotlib import pyplot as pltplt.rcParams['font.family'] = 'SimHei'plt.rcParams['axes.unicode_minus'] = Falseplt.rcParams['font.size'] = 15plt.figure(figsize = (20,8))# 訓練集散點圖plt.scatter(x_train,y_train,color = 'green',marker = 'o',label = '訓練集')# 測試集散點圖plt.scatter(x_test,y_test,color = 'orange',marker = 'o',label = '測試集')# 迴歸線plt.plot(x,lr.predict(x),'r-')plt.legend()plt.xlabel('花瓣長度')plt.ylabel('花瓣寬度')
就這樣畫出了一張很醜的圖,如果想畫更精美的圖或者其他方面的比較,各位讀者不妨自己去試一試吧。
剛剛我們做了對鳶尾花花瓣長度和寬度的線性迴歸,探討長度與寬度的關係,探究鳶尾花的花瓣寬度受長度變化的趨勢是怎麼樣的。但是在現實生活當中的資料是十分複雜的,像這種單因素影響的事物是比較少的,我們需要引入多元線性迴歸來對多個因素的權重進行分配,從而與複雜事物相符合。
2.boston房價預測(多元線性迴歸)
吶,boston資料集的介紹在這裡了,我就不詳細介紹了現在,我們要探討boston當中每一個因素對房價的影響有多大,這就是一個多因素影響的典型例子。
import pandas as pdimport numpy as npfrom sklearn.datasets import load_bostonfrom sklearn.linear_model import LinearRegressionfrom sklearn.model_selection import train_test_splitboston = load_boston()# lr繼承LinearRegression類lr = LinearRegression()# 因為boston.data本身就是二維陣列,所以無需轉置,boston.target是房價x,y = boston.data,boston.targetx_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.15,random_state = 0)lr.fit(x_train,y_train)# 顯示權重,因為有很多因素,所以權重也有很多個print(lr.coef_)# 顯示截距print(lr.intercept_)y_hat = lr.predict(x_test)# 模型評判仍然是用那幾個包,這裡不再贅述。
結果如下,可以發現每一個因素都有相應的權重。
[-1.24536078e-01 4.06088227e-02 5.56827689e-03 2.17301021e+00-1.72015611e+01 4.02315239e+00 -4.62527553e-03 -1.39681074e+002.84078987e-01 -1.17305066e-02 -1.06970964e+00 1.02237522e-02-4.54390752e-01]36.09267761760974