1. 程式人生 > 實用技巧 >python線性迴歸

python線性迴歸

一.理論基礎

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 LinearRegression
import numpy as np

iris = 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
# 求解MSE
print('MSE:',mean_squared_error(y_test,y_hat))
# 求解RMSE,是MSE的開根號
print('RMSE:',np.sqrt(mean_squared_error(y_test,y_hat))
# 求解MAE
print('MAE:',mean_absolute_error(y_test,y_hat))
# 求解R方,有兩種方法,注意lr.score的引數是x_test,y_test
print('R方:',r2_score(y_test,y_hat))
print('R方:',lr.score(x_test,y_test))


# 匯入matplotlib模組,進行視覺化
from matplotlib import pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 15
plt.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 pd
import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
boston = load_boston()
# lr繼承LinearRegression類
lr = LinearRegression()
# 因為boston.data本身就是二維陣列,所以無需轉置,boston.target是房價
x,y = boston.data,boston.target
x_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+00
2.84078987e-01 -1.17305066e-02 -1.06970964e+00 1.02237522e-02
-4.54390752e-01]
36.09267761760974

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯絡我們以作處理

想要獲取更多Python學習資料可以加
QQ:2955637827私聊
或加Q群630390733
大家一起來學習討論吧!