全文共4968字,預計學習時長15分鐘或更長算法
本文旨在爲讀者理解和應用線性迴歸時提供參考。雖然線性迴歸算法很簡單,可是隻有少數人能真正理解其基本原則。編程
本文首先會深刻挖掘線性迴歸理論,理解其內在的工做機制,而後利用Python實現該算法,爲商業問題建模。api
理論微信
線性迴歸或許是學習統計學最簡單的方法。在學習更高級的方法以前,這是一個很好的入門方法。事實上,許多更高級的方法可被視爲線性迴歸的延伸。所以,理解好這一簡單模型將爲未來更復雜的學習打下良好基礎。學習
線性迴歸能夠很好地回答如下問題:測試
· 兩個變量間有關係嗎?人工智能
· 關係有多強?spa
· 哪個變量的影響最大?3d
· 預測的各個變量影響值能有多精確?orm
· 預測的目標值能有多精確?
· 其關係是線性的嗎?
· 是否有交互做用?
預估係數
假設僅有一個自變量和因變量,那麼線性迴歸表達以下:
一個自變量和因變量線性模型的方程式
在上圖的方程中,兩個β就是係數。在模型中預測結果須要用到這些係數。
那麼,如何算出這些參數呢?
爲此,須要最小化最小二乘法或者偏差平方和。固然,線性模型也不是完美的,也不能準確預測出全部數據,這就意味着實際值和預測值間存在差別。該偏差能用如下方程簡單算出:
實際值減去預測值
但爲何要平方偏差呢?
平方偏差,是由於預測值可能大於也可能小於實際值,從而分別產生負或正的偏差。若是沒有平方偏差值,偏差的數值可能會由於正負偏差相消而變小,而並不是由於模型擬合好。
此外,平方偏差會加大偏差值,因此最小化平方偏差能夠保證模型更好。
下圖有助於更好地理解這個概念:
線性擬合數據集
在上述圖表中,紅點是實際值,而藍線是線性模型。灰線展示了預測值和實際值之間的偏差。所以,藍線就是灰線長度平方的最小值。
通過一系列超出本文難度的數學計算,最終能夠獲得如下這個方程式,用以計算參數。
x和y表明平均值
預估係數的相關性
目前已得知係數,那麼如何證實係數與因變量是否相關?
最好的方法就是找到p值。p值被用於量化數據的重要性,它能判斷零假設是否被否認。
什麼是零假設?
全部建模任務都是在自變量和因變量存在必定關聯的假設下進行的。而零假設則正好相反,也就是說自變量和因變量之間沒有任何關聯。
所以,算出每個係數的p值就能得知,從數據值上來講,該變量對於預估因變量是否重要。通常來講,若是p值小於0.05,那麼自變量和因變量就之間存在強烈關係。
評估模型的準確性
經過找出p值,從數據值上來講,自變量是很是重要的。
如何得知該線性模型是擬合好呢?
一般使用RSE(殘差標準差)和 R 來評估模型。
RSE計算公式
R計算公式
第一個偏差度量很容易理解:殘差越小,模型數據擬合越好(在這種狀況下,數據越接近線性關係)。
R能夠衡量因變量的變化比例,並用自變量x表述。所以,假設在一個線性方程中,自變量x能夠解釋因變量,那麼變化比例就高, R 將接近1。反之,則接近0。
多元線性迴歸理論
在現實生活中,不會出現一個自變量預測因變量的狀況。因此,線性迴歸模型是一次只分析一個自變量嗎?固然不是了,實際狀況中採起多元線性迴歸。
該方程式和一元線性迴歸方程很像,只不過是再加上預測數和相應的係數。
多元線性迴歸等式。p表示自變量的個數。
評估自變量的相關性
在前文中,經過找出p值來評估一元線性迴歸中自變量的相關性。在多元線性迴歸中,F統計量將被用於評估相關性。
F統計量計算公式。n表示數據量,p表示自變量的個數。
F統計量在整個方程中計算,而p值則針對特定的自變量。若是二者有強烈的相關性,F大於1。相反,F大約等於1。
比1大多少是足夠大呢?
這是一個很難回答的問題。一般,若是數據中有一個很大的數值的話,F能夠僅比1大一點點,而又表明了強烈的相關性。若是數據集中的數據量很小的話,F值必定要比1大不少,才能表示強烈的相關性。
爲何在這種狀況下不能使用p值呢?
由於咱們擬合了許多自變量,因此咱們須要考慮一個有不少自變量的狀況(p值很大)。當自變量的數量較大時,一般會有大約5%的自變量的p值會很小——即便它們在統計上並不顯著。所以,咱們使用F統計量來避免將不重要的自變量視爲重要的自變量。
評估模型準確性
和一元線性迴歸模型同樣,多元線性迴歸模型的準確性也能夠用R來評估。然而,須要注意的是,隨着自變量數量的增長,R的數值也會增大。這是由於模型必然和訓練數據擬合得更好。
可是,這並不意味着該模型在測試數據上(預測未知數據時)也會有很好的表現。
增長干擾
在線性模型中,多元自變量意味着其中一些自變量會對其餘自變量產生影響。
好比說,已知一我的年齡和受教育年數,去預測她的薪資。很明顯,年齡越大,受教育時長就越長。那麼,在建模時,要怎樣處理這種干擾呢?
以兩個自變量爲例:
多元線性迴歸中的干擾
從上式可知,咱們將兩個自變量相乘,獲得一個新的係數。從簡化的公式中能夠看到,該係數受到另外一個特徵值的影響。
一般來講,在將干擾模型考慮在內時,也須要考慮個體特徵的影響,即便在p值不重要時也要這麼作。這就是分層遞階原則。該原則背後的根據是,若是兩個自變量互相干擾,那麼將它們個體影響考慮在內將會對建模有很小的影響。
以上就是線性迴歸的基本原理。接下來本文將介紹如何在Python中實現一元線性迴歸和多元線性迴歸,以及如何評估兩種模型的模型參數質量和模型總體表現。
強烈建議讀者在閱讀本文以後動手在Jupyter notebook上覆現整個過程,這將有助於讀者充分理解和利用該教程。
那麼開始吧!
本文用到的數據集包括在電視、廣播和報紙上花費的廣告費用及各自帶來的銷售額。
該實驗旨在利用線性代數了解廣告費用對銷售額的影響。
導入庫
利用Python編程有一個好處,就是它能夠提供多個庫的渠道,使得咱們能夠快速讀取數據、繪製數據和執行線性迴歸。
筆者習慣於將全部必要的庫放在代碼的開頭,使代碼井井有理。導入:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
import statsmodels.api as sm
讀取數據
下載數據集後,將數據集放在項目文件的數據目錄中,讀取數據:
data = pd.read_csv("data/Advertising.csv")
查看數據時,輸入:
data.head()
獲得結果以下:
能夠看到,「未命名:0」列是多餘的。因此,咱們把這一列刪除。
data.drop(['Unnamed: 0'], axis=1)
如今數據已經清理完畢,能夠運行線性迴歸了!
簡單線性迴歸
建模
使用簡單線性迴歸建模時,這裏只考慮電視廣告對銷售額的影響。在正式建模以前,首先查看一下數據。
能夠利用matplotlib(一個經常使用的Python繪製庫)來畫一個散點圖。
plt.figure(figsize=(16, 8))plt.scatter(data['TV'],data['sales'],c='black')plt.xlabel("Money spent on TV ads ($)")plt.ylabel("Sales ($)")plt.show()
運行上述代碼,能夠獲得下圖:
電視廣告費用和銷售額散點圖
從圖中能夠看到,電視廣告費用和銷售額明顯相關。
基於此數據,能夠得出線性近似。操做以下:
X = data['TV'].values.reshape(-1,1)
y = data['sales'].values.reshape(-1,1)
reg = LinearRegression()
reg.fit(X, y)
print("The linear model is: Y = {:.5} + {:.5}X".format(reg.intercept_[0], reg.coef_[0][0]))
就這麼簡單?
對的!對數據集給出一條擬合直線並查看等式參數就是這麼簡單。在該案例中,能夠獲得:
一元線性迴歸等式
接下來將數據擬合線可視化。
predictions = reg.predict(X)
plt.figure(figsize=(16, 8))plt.scatter(data['TV'],data['sales'],c='black')plt.plot(data['TV'],predictions,c='blue',linewidth=2)plt.xlabel("Money spent on TV ads ($)")plt.ylabel("Sales ($)")plt.show()
能夠獲得:
線性擬合
從上圖能夠發現,一元線性迴歸模型彷佛就能夠大體解釋電視廣告費用對銷售額的影響。
評估模型相關性
接下來是檢驗一個模型表現是否良好,須要查看它的R值和每一個係數的p值。
輸入如下代碼:
X = data['TV']y = data['sales']
X2 = sm.add_constant(X)est = sm.OLS(y, X2)est2 = est.fit()print(est2.summary())
能夠獲得以下輸出:
R值和p值
觀察兩個係數能夠發現,p值雖然並不必定是0,可是很是低。這意味着這些係數和目標值(此處即銷售額)之間有很強烈的聯繫。
同時能夠觀察到,R值爲0.612。這說明大約60%的銷售額變化是能夠由電視廣告花費來解釋的。這樣的結果是合理的。可是,這必定不是能夠用來準確預測銷售額的最好的結果。在報紙和廣播廣告上的花費一定對銷售額有必定的影響。
接下來將檢測多元線性迴歸模型是否能取得更好的結果。
多元線性迴歸
建模
和一元線性迴歸的建模過程同樣,定義特徵值和目標變量,並利用scikit-learn庫來執行線性迴歸模型。
Xs = data.drop(['sales', 'Unnamed: 0'], axis=1)
y = data['sales'].reshape(-1,1)
reg = LinearRegression()
reg.fit(Xs, y)
print("The linear model is: Y = {:.5} + {:.5}*TV + {:.5}*radio + {:.5}*newspaper".format(reg.intercept_[0], reg.coef_[0][0], reg.coef_[0][1], reg.coef_[0][2]))
就是這麼簡單!根據上述代碼能夠獲得以下等式:
多元線性迴歸等式
固然,因爲一共有四個變量,這裏沒法把三種廣告媒介對銷售額的影響可視化,那將須要一個四維圖形。
須要注意的是,報紙的係數是負數,而且很小。這和模型有關嗎?爲了回答這個問題,咱們須要計算模型的F統計量、R值以及每一個係數的p值。
評估模型相關性
正如你所想,這一步驟和一元線性迴歸模型中的相應步驟很是類似。
X = np.column_stack((data['TV'], data['radio'], data['newspaper']))
y = data['sales']
X2 = sm.add_constant(X)
est = sm.OLS(y, X2)
est2 = est.fit()
print(est2.summary())
能夠獲得:
R值,p值和F統計量
能夠看到,多元線性迴歸模型的R值比一元線性迴歸模型要高得多,達到了0.897!
其F統計量爲570.3。這比1要大得多。因爲本文使用的數據集比較小(只有200個數據),這說明廣告花費和銷售額之間有強烈的聯繫。
最後,因爲本文只用了三個自變量能夠利用p值來衡量它們是否與模型相關。從上表能夠發現,第三個係數(即報紙廣告的係數)的p值比另外兩個要大。這說明從數據來看,報紙廣告花費並不重要。去除這個自變量可能會使R有輕微降低,可是能夠幫助獲得更加準確的預測結果。
線性迴歸模型也許不是表現最好的模型,但瞭解線性迴歸是很是重要的,這將幫助咱們打好基礎,理解更加複雜的統計學方法。
留言 點贊 關注
咱們一塊兒分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 「讀芯術」
(添加小編微信:dxsxbb,加入讀者圈,一塊兒討論最新鮮的人工智能科技哦~)