公號:碼農充電站pro
主頁:https://codeshellme.github.io
線性回歸模型用於處理回歸問題,也就是預測連續型數值。線性回歸模型是最基礎的一種回歸模型,理解起來也很容易,我們從解方程組談起。
1,解方程組
相信大家對解方程都不陌生,這是我們初中時期最熟悉的數學知識。
假如我們有以下方程組:
- 2x + y = 3 —— ①
- 5x - 2y = 7 —— ②
要解上面這個方程組,我們可以將第一個方程的等號兩邊都乘以2:
- 4x + 2y = 6 —— ③
再將第2 個方程與第3 個方程的等號兩邊分別相加:
- 9x = 13 —— ④
這樣我們就將變量y 消去了,就可以求解出x 的值。然后再將x 的值代入第1或第2個方程中,就可以解出y 的值。
以上這個解方程的過程就是高斯消元法。
2,線性回歸模型
如果將上面方程組中的任意一個表達式單拿出來,那么x 和 y 都是一種線性關系,比如:
- y = 3 - 2x
該表達式中,我們將x 叫做自變量,y 叫作因變量。
如果將其擴展到機器學習中,那么特征集就相當於自變量X,目標集就相當於因變量Y。
當自變量的個數大於1時,就是多元回歸;當因變量的個數大於1 時,就是多重回歸。
線性回歸模型的目的就是想找出一種特征集與目標集之間的線性關系,使得我們可以通過已知的特征數據預測出目標數據。
通常,我們的模型是通過多個特征值來預測一個目標值,那么線性回歸模型的數學公式為:
其中:
- y 表示我們要預測的目標值。
- x1,x2...xn 代表每個特征,一共有n 個特征。
- b1,b2...bn 代表每個特征的系數,特征系數也代表了某個特征對目標值的影響。
- b0 是一個常數,稱為截距。
- ε 表示模型的誤差,也被稱作損失函數。
線性回歸模型與數學中的解方程不同,后者的結果是精確解,而前者則是一個近似解。因此在公式中存在一個 ε 。
我們的目標是求得一組使得 ε 最小的特征系數(b1,b2...bn),當有了新的特征時,就可以根據特征系數求得預測值。
回歸一詞的來源
1875 年,英國科學家弗朗西·斯高爾頓(達爾文的表弟)嘗試尋找父代身高與子代身高之間的關系。
在經過了1078 份數據的分析之后,最終他得出結論:人類的身高維持在相對穩定的狀態,他稱之為回歸效應,並給出了歷史上第一個回歸公式:
Y = 0.516X + 33.73
公式中的 Y 代表子代身高,X 代表父代身高,單位為英寸。
3,線性擬合
線性擬合中不存在精確解,但是存在最優解,也就是使得 ε 最小的解。
上圖中有3 個坐標系:
- 在第1個圖中只有兩個點,這時候存在一條唯一的直線能夠同時穿過這兩個點,這條直線就是精確解。
- 當坐標中的點多於兩個時,比如第2個圖,這時候就不可能存在一條直線,同時穿過這些點。但是會存在多條直線,會盡可能多的穿過更多的點,就像圖3。而這些直線中會有一條直線,是這些點的最好的擬合。
如何才能找到這條最好的擬合的直線呢?
4,最小二乘法
最小二乘法可以用來求解這個最優直線。
最小二乘法的主要思想是讓真實值與預測值之差(即誤差)的平方和達到最小。用公式表示如下:
上面的公式中:
- yi 是數據的真實值。
- y^ 是數據的預測值。
- ε 是我們要找的最小誤差,它是所有的真實值與預測值之差的平方的和。
方程組除了可以使用高斯消元法求解之外,還可以使用矩陣來求解。
將上面的 ε 公式寫成矩陣的形式就是:
其中:
- B 為系數矩陣
- X 為特征矩陣
- Y 為目標矩陣
我們的目標就是找到一個向量B,使得向量 XB 與 Y 之間歐氏距離的平方數最小。
經過一系列的推導之后,系數矩陣B 為:
其中:
X'
是X
的轉置矩陣。(X'X)
-1 是(X'X)
的逆矩陣。
5,用 numpy 庫進行矩陣運算
NumPy 是一個使用Python 進行科學計算的軟件包,其中就實現了我們需要的矩陣運算:
x.transpose()
:矩陣x 的轉置運算。x.dot(y)
:矩陣x 點乘矩陣y。x.I
:返回可逆矩陣x 的逆矩陣。
那么根據公式:
我們可以編寫求B 的函數:
def get_B(X, Y):
_X = X.transpose()
B = (_X.dot(X)).I.dot(_X).dot(Y)
return B
假設我們有以下數據集,要對該數據集進行線性擬合:
特征x1 | 特征x2 | 目標y |
---|---|---|
0 | 1 | 1.4 |
1 | -1 | -0.48 |
2 | 8 | 13.2 |
我們知道線性回歸的公式為:
那么上面表格的數據轉化為方程組:
- b0 + b1⋅0 + b2⋅1 = 1.4
- b0 + b1⋅1 - b2⋅1 = −0.48
- b0 + b1⋅2 + b2⋅8 = 13.2
那么矩陣X 為:
轉化為代碼如下:
from numpy import *
X = mat([
[1,0,1],
[1,1,-1],
[1,2,8]
])
Y = mat([[1.4],[-0.48],[13.2]])
計算系數矩陣B:
>>> get_B(X, Y)
matrix([[-0.01454545], # b0
[ 0.94909091], # b1
[ 1.41454545]]) # b2
這樣就得出了各個系數項,我們可以用這些系數項進行數據預測。
6,sklearn 對線性回歸的實現
sklearn 庫中的 LinearRegression 類是對線性回歸的實現。
LinearRegression 類的原型:
LinearRegression(
fit_intercept=True,
normalize=False,
copy_X=True,
n_jobs=None)
來看下其參數的含義:
- fit_intercept:擬合模型時,是否存在截距
b0
,默認為True
,即存在。 - normalize:在擬合模型之前,是否要對特征集進行標准化處理。
- 當 fit_intercept 為
False
時,該參數被忽略。
- 當 fit_intercept 為
- copy_X:是否復制特征集
X
。 - n_jobs:用於計算的作業數,只對多重回歸且比較復雜的數據進行加速。
接下來,使用 LinearRegression 類對上面表格數據進行擬合。(為了方便查看,我將表格放在這里)
特征x1 | 特征x2 | 目標y |
---|---|---|
0 | 1 | 1.4 |
1 | -1 | -0.48 |
2 | 8 | 13.2 |
將該表格數據轉化成 Python 變量,如下:
X = [(0, 1), [1, -1], [2, 8]]
Y = [1.4, -0.48, 13.2]
創建線性回歸對象:
from sklearn.linear_model import LinearRegression
reg = LinearRegression() # 均使用默認參數
擬合數據:
reg.fit(X, Y)
coef_
屬性是特征系數列表:
>>> reg.coef_
array([0.94909091, 1.41454545])
intercept_
屬性是截距 b0
的值:
>>> reg.intercept_
-0.014545454545452863
通過coef_
和intercept_
屬性可以看到,使用 LinearRegression 類和使用 NumPy 得到的結果是一樣的。
需要注意的是,只有當數據集的特征集與目標集是線性關系時,才能使用線性回歸擬合出一個不錯的結果。如果不是線性關系,則擬合結果一般不會很好。
對於非線性關系的回歸問題,可以使用樹回歸等其它模型。
那如何判斷特征集與目標集是否是線性關系呢?有兩個指標:
- 決定系數 R2:該指標使用了回歸平方和與總平方和之比,是反映模型擬合度的重要指標。
- 它的取值在 0 到 1 之間,越接近於 1 表示擬合的程度越好、數據分布越接近線性關系。
- 校正的決定系數 Rc2:如果特征非常多,那么Rc2 指標將更加可靠。
LinearRegression 類中的 score
方法就是R2 指標的實現:
>>> reg.score(X, Y)
1.0 # 結果是 1,說明特征集與目標集是非常好的線性關系。
7,對波士頓房價進行線性分析
對於波士頓房價數據集,之前的文章中,已經多次使用過,這次我們對其使用線性回歸模型進行分析。
首先加載數據:
from sklearn.datasets import load_boston
boston = load_boston()
features = boston.data # 特征集
prices = boston.target # 目標集
創建線性回歸對象:
from sklearn.linear_model import LinearRegression
# 在擬合之前對數據進行標准化處理
reg = LinearRegression(normalize=True)
擬合數據:
reg.fit(features, prices)
對模型進行評分:
>>> reg.score(features, prices)
0.7406426641094095
通過評分可知,最終的准確率為74.1%,雖談不上很高,但也還說得過去。
8,總結
使用最小二乘法訓練出的線性回歸模型是最簡單基礎的一種線性模型,只有當特征集與目標集呈線性關系時,它才能擬合出比較好的結果。
在它的基礎之上,還有很多改進版的線性模型,比如:局部加權線性回歸,嶺回歸,lasso 等,你可以在 Sklearn Linear Models 進一步了解和學習。
(本節完。)
推薦閱讀:
歡迎關注作者公眾號,獲取更多技術干貨。