線性迴歸
1 線性迴歸
背景主題
講述線性迴歸模型,用來實現連續類型變量的預測。
目標
- 掌握線性迴歸模型的原理
- 能夠使用線性迴歸進行預測
- 能夠對線性迴歸模型進行評估
2 線性迴歸知識要點
2.1 數據建模
2.1.1 模型概念
模型我們可以理解爲一個函數(一種映射規則)。
通俗的講:
從外層角度想——模型就是個黑盒子:輸入一個值輸出一個預測值。
從內層想——模型就類似一個函數(一種映射規則,例如:y= f (x) )。
由訓練數據來確定函數的參數,當參數確定好後,我們就可以利用該模型(函數)對未知的數據(非訓練時使用的數據)進行求值,也就是進行預測。
輸入模型的數據,我們稱之爲訓練數據。
通過不斷的進行訓練,最終得到一個合適的模型,從而可以對未知的數據進行預測。而這個過程,是與我們人類學習的過程是相似的。只不過人們的認知和判斷是通過經驗得到的,而機器的認知與判斷是通過數據得到的。
我們使用樣本數據訓練模型,數據中的每個屬性,我們稱爲特徵。
每條數據的目標輸出值,我們稱爲標籤(監督學習)。
特徵:x
標籤:y
這與函數y = f (x) 相符
例如:
我們不難找出x與y之間的關係是:y=x+1
這樣,當產生新的未知數據時(沒有標籤的數據),我們就可以使用該模型進行預測了。例如,當新數據x=7時,我們就可以輕鬆預測y=8。
然而,現實中的數據不可能像上例中那麼簡單,模型也不可能總是通過肉眼就能觀察出來的。
例如:在鳶尾花數據集中,花瓣長度與花瓣寬度的部分數據如下:
對於這樣的數據,我們是不容易發現二者之間的關係的。因此,這就需要我們通過機器學習算法來進行建模了。
2.1.2 迴歸分析
迴歸分析:
用來評估變量之間關係的統計過程。
用來解釋變量X與變量Y的關係。
當自變量X發生改變時,因變量Y會如何發生改變。
2.1.2.1 線性迴歸
線性迴歸:
是迴歸分析的一種,評估的自變量X與因變量Y之間是一種線性關係。
當只有一個自變量X發生時,因變量Y會如何發生改變。
線性關係的理解:
- 畫出來的圖像是直的。
- 每個自變量的最高次項爲1。
2.1.2.2 擬合
擬合:
是指構建一種算法(數學函數),使得該算法能夠符合真實的數據。
從機器學習角度講,線性迴歸就是要構建一個線性函數
,使得該函數與目標值之間的相符性最好。
從空間的角度看,就是要讓函數的直線(面),儘可能靠近空間中所有的數據點(點到直線的平行與y軸的距離之和最短)。
線性迴歸會輸出一個連續值。
y^
——預測值
y
——真實值
誤差值越小越好,越小說明建立得到模型越準確
。
對於線性迴歸來說,他的本質就是要擬合出一條最佳的直線
,y^ = f (x) ,使得這個點到直線的距離最短
,使得真實值和預測值誤差最小
,最短考量的是所有的情況。
2.2 線性迴歸模型
2.2.1 簡單線性迴歸
我們以房屋面積(x)與房屋價格(y)爲例,顯而易見,這兩者是一種線性關係,房屋價格正比於房屋面積,我們假設比例爲w:
y^ = w * x
然而,這種線性方程一定是過原點的,即當x=0時,y也一定爲0。這可能並不符合現實中的某些場景。爲了能夠讓方程具有更廣泛的適應性,我們這裏再增加一個截距,設爲b,即:
y^ = w * x + b
這個方程就是我們數據建模的模型。方程中的w和b就是模型的參數。
假定數據集數據如下:
線性迴歸是用來解釋自變量和因變量之間的關係,但是,這種關係並非嚴格的函數映射關係。從數據集中,我們也看到了這一點。相同面積的房屋,價格並不完全相同,但是,也不會相差太大。
什麼是嚴格的函數映射關係?
指的是x 相同,y一定是相同的。
2.2.2 多元線性迴歸
現實生活中數據可能是比較複雜的,自變量也很可能不是一個。
例如:影響房屋價格可能不止房屋面積一個因素,可能還有樓層,距地鐵站的距離,距市中心的距離,房間數量等等。不過,這些因素對房屋價格影響的力度(權重)是不同的,例如:房屋所在樓層對房屋價格的影響就遠不及房屋的面積,因此,我們可以使用多個權重來表示多個因素與房屋的關係:
我們可以進一步簡化,爲向量w和b 各加入一個分量w0和x0,並且令:
我們現在的目的就是,從現有的數據(經驗)中,去學習(確定)w 與 b 的值,我們能夠確定擬合數據的線性方程,這樣就可以對未知得到數據 x (房屋面積)進行預測 y (房屋價格)。
平方和最小指的是:y^ - y (預測值-真實值)或 y - y^ (真實值-預測值)可能會出現負數,所以要用平方和去衡量。
正確的是:AD
A選型,對於w與b確定的方程,應該使得所有數據(點)到直線的距離(憑平行於y軸的距離)平方和最小。
正確
B選項,線性迴歸擬合的方程不可能穿過所有的點(每條數據)。
C選項,對於相同的輸入數據,方程預測的結果肯定是相同的,y^ = f (x)。
D選項,線性迴歸模型輸出的是連續值
,正確。
2.3 損失函數與參數求解
2.3.1 損失函數
損失函數,也稱爲目標函數和代價函數,簡單的說,就是關於誤差的一個函數
。
損失函數用來衡量模型預測值和真實值之間的差異。
機器學習的目標,就是建立一個損失函數,使得該函數的值最小。
損失函數我們通常用 J
來表示,例如, J(w) 則表示以 w 爲自變量的函數。
在線性迴歸中,我們使用平方損失函數(最小二乘法)(最小平方法
),定義如下:
2.3.2 參數求解
2.4 簡單線性迴歸程序
我們以鳶尾花數據集中,花瓣長度與花瓣寬度爲例,通過程序來實現簡單線性迴歸。
import numpy as np
# 用於線性迴歸的類。
from sklearn.linear_model import LinearRegression
# 用來切分訓練集與測試集。
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
# 設置輸出的精度。默認爲8。
np.set_printoptions(precision=2)
iris = load_iris()
# 獲取花瓣長度作爲X,花瓣寬度作爲y。
X, y = iris.data[:, 2].reshape(-1, 1), iris.data[:, 3]
#定義線性迴歸LinearRegression
lr = LinearRegression()
# 將數據集劃分爲訓練集與測試集。
# test_size:測試集大小。
# random_state:隨機種子,可用來產生相同的隨機數序列。
# X_train x的訓練集,X_test x的測試集
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)
print("權重:", lr.coef_) # 返回的就是 w 的值
print("截距:", lr.intercept_) #返回的就是 b 的值
# y^ = w * x + b
# 從訓練集學習到了模型的參數(w與b),確定方程,就可以進行預測。
# 進行預測 predict
y_hat = lr.predict(X_test)
print("實際值:", y_test[:5])
print("預測值:", y_hat[:5])
補充筆記(fit、predict、score):
sklearn對Data Mining的各類算法已經有了較好的封裝,基本可以使用fit、predict、score來訓練、評價模型,並使用模型進行預測。
迴歸計算:
學習鏈接!!!
結果:
我們可以通過可視化將其呈現出來:
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
plt.rcParams["font.size"] = 15
plt.figure(figsize=(10, 6))
plt.scatter(X_train, y_train, c="orange", label="訓練集")
plt.scatter(X_test, y_test, c="g", marker="D", label="測試集")
plt.plot(X, lr.predict(X), "r-")
plt.legend()
plt.xlabel("花瓣長度")
plt.ylabel("花瓣寬度")
接下來我們可以看下預測值和真實值之間有着怎樣的差異呢?
plt.figure(figsize=(15, 6))
plt.plot(y_test, label="真實值", color="r", marker="o")
plt.plot(y_hat, label="預測值", ls="--", color="g", marker="o")
plt.xlabel("測試集數據序號")
plt.ylabel("數據值")
plt.legend()
從圖中可以看到,預測值和真實值之間從總體上看效果不錯,有的點(數據)甚至有重合的情況出現。
這就是在我們已知的數據上建立模型並且針對未知的數據實現了一種預測的效果。
2.5 迴歸模型評估
當我們建立好模型後,模型的效果如何呢?對於迴歸模型,我們可以採用如下的指標來進行衡量。
2.5.1 MSE (平均平方誤差)
2.5.2 RMSE (平均平方誤差的平方根)
2.5.3 MAE (平均絕對值誤差)
數據集的不同導致無法判斷MSE。
2.5.4 R²(決定係數)
在訓練集中,R²的取值範圍爲 [0,1]
在測試集中,R²的取值範圍爲 [-∞,0]
也就是說,R² 越趨近於1效果越好,越趨近於0或者越趨近於負無窮效果越差。
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
print("均方誤差(MSE):", mean_squared_error(y_test, y_hat))
print("根均方誤差(RMSE):", np.sqrt(mean_squared_error(y_test, y_hat)))
print("平均絕對值誤差(MAE):", mean_absolute_error(y_test, y_hat))
print("訓練集R^2:", r2_score(y_train, lr.predict(X_train)))
print("測試集R^2:", r2_score(y_test, y_hat))
# socre其實求解的就是r^2的值。但是注意,r2_score方法與score方法傳遞參數的內容是不同的。
print("訓練集R^2:", lr.score(X_train, y_train))
print("測試集R^2:", lr.score(X_test, y_test))
結果:
從結果看,R² 測試集等於 0.8931453922584154,接近1,效果不錯。
R²
在評估的時候是經常使用的一個指標,好處在於不受數量集的影響
,它是一個有界的取值範圍。
2.5.5 多元線性迴歸程序
類似的,我們可以實現多元線性迴歸。
我們以波士頓房價爲例來進行演示。
波士頓房價的數據說明如下:
通過這些因素預測房屋的價格。
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
import pandas as pd
boston = load_boston()
X, y = boston.data, boston.target
df = pd.DataFrame(np.concatenate([X, y.reshape(-1, 1)], axis=1),
columns=boston.feature_names.tolist() + ["MEDV"])
df.head()
結果:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
lr = LinearRegression()
lr.fit(X_train, y_train)
print("模型權重:", lr.coef_)
print("截距:", lr.intercept_)
y_hat = lr.predict(X_test)
print("訓練集R^2:", lr.score(X_train, y_train))
print("測試集R^2:", lr.score(X_test, y_test))
結果:
3 總結
- 模型的概念及應用
- 線性迴歸模型的建立與預測
- 迴歸模型的評估方式