公號:碼農充電站pro
主頁:https://codeshellme.github.iohtml
線性迴歸模型用於處理迴歸問題,也就是預測連續型數值。線性迴歸模型是最基礎的一種迴歸模型,理解起來也很容易,咱們從解方程組談起。python
相信你們對解方程都不陌生,這是咱們初中時期最熟悉的數學知識。git
假如咱們有如下方程組:github
要解上面這個方程組,咱們能夠將第一個方程的等號兩邊都乘以2:算法
再將第2 個方程與第3 個方程的等號兩邊分別相加:shell
這樣咱們就將變量y 消去了,就能夠求解出x 的值。而後再將x 的值代入第1或第2個方程中,就能夠解出y 的值。機器學習
以上這個解方程的過程就是高斯消元法。函數
若是將上面方程組中的任意一個表達式單拿出來,那麼x 和 y 都是一種線性關係,好比:學習
該表達式中,咱們將x 叫作自變量,y 叫做因變量。3d
若是將其擴展到機器學習中,那麼特徵集就至關於自變量X,目標集就至關於因變量Y。
當自變量的個數大於1時,就是多元迴歸;當因變量的個數大於1 時,就是多重回歸。
線性迴歸模型的目的就是想找出一種特徵集與目標集之間的線性關係,使得咱們能夠經過已知的特徵數據預測出目標數據。
一般,咱們的模型是經過多個特徵值來預測一個目標值,那麼線性迴歸模型的數學公式爲:
其中:
線性迴歸模型與數學中的解方程不一樣,後者的結果是精確解,而前者則是一個近似解。所以在公式中存在一個 ε 。
咱們的目標是求得一組使得 ε 最小的特徵係數(b1,b2...bn),當有了新的特徵時,就能夠根據特徵係數求得預測值。
迴歸一詞的來源
1875 年,英國科學家弗朗西·斯高爾頓(達爾文的表弟)嘗試尋找父代身高與子代身高之間的關係。
在通過了1078 份數據的分析以後,最終他得出結論:人類的身高維持在相對穩定的狀態,他稱之爲迴歸效應,並給出了歷史上第一個迴歸公式:
Y = 0.516X + 33.73
公式中的 Y 表明子代身高,X 表明父代身高,單位爲英寸。
線性擬閤中不存在精確解,可是存在最優解,也就是使得 ε 最小的解。
上圖中有3 個座標系:
如何才能找到這條最好的擬合的直線呢?
最小二乘法能夠用來求解這個最優直線。
最小二乘法的主要思想是讓真實值與預測值之差(即偏差)的平方和達到最小。用公式表示以下:
上面的公式中:
方程組除了可使用高斯消元法求解以外,還可使用矩陣來求解。
將上面的 ε 公式寫成矩陣的形式就是:
其中:
咱們的目標就是找到一個向量B,使得向量 XB 與 Y 之間歐氏距離的平方數最小。
通過一系列的推導以後,係數矩陣B 爲:
其中:
X'
是 X
的轉置矩陣。(X'X)
-1 是(X'X)
的逆矩陣。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 |
咱們知道線性迴歸的公式爲:
那麼上面表格的數據轉化爲方程組:
那麼矩陣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
這樣就得出了各個係數項,咱們能夠用這些係數項進行數據預測。
sklearn 庫中的 LinearRegression 類是對線性迴歸的實現。
LinearRegression 類的原型:
LinearRegression( fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)
來看下其參數的含義:
b0
,默認爲True
,即存在。False
時,該參數被忽略。X
。接下來,使用 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 獲得的結果是同樣的。
須要注意的是,只有當數據集的特徵集與目標集是線性關係時,才能使用線性迴歸擬合出一個不錯的結果。若是不是線性關係,則擬合結果通常不會很好。
對於非線性關係的迴歸問題,可使用樹迴歸等其它模型。
那如何判斷特徵集與目標集是不是線性關係呢?有兩個指標:
LinearRegression 類中的 score
方法就是R2 指標的實現:
>>> reg.score(X, Y) 1.0 # 結果是 1,說明特徵集與目標集是很是好的線性關係。
對於波士頓房價數據集,以前的文章中,已經屢次使用過,此次咱們對其使用線性迴歸模型進行分析。
首先加載數據:
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%,雖談不上很高,但也還說得過去。
使用最小二乘法訓練出的線性迴歸模型是最簡單基礎的一種線性模型,只有當特徵集與目標集呈線性關係時,它才能擬合出比較好的結果。
在它的基礎之上,還有不少改進版的線性模型,好比:局部加權線性迴歸,嶺迴歸,lasso 等,你能夠在 Sklearn Linear Models 進一步瞭解和學習。
(本節完。)
推薦閱讀:
歡迎關注做者公衆號,獲取更多技術乾貨。