Python 散点图线性拟合_一文教你全面掌握用Python实现线性回归
本文旨在為讀者理解和應用線性回歸時提供參考。雖然線性回歸算法很簡單,但是只有少數人能真正理解其基本原則。
本文首先會深入挖掘線性回歸理論,理解其內在的工作機制,然后利用Python實現該算法,為商業問題建模。
理論
線性回歸或許是學習統計學最簡單的方法。在學習更高級的方法之前,這是一個很好的入門方法。事實上,許多更高級的方法可被視為線性回歸的延伸。因此,理解好這一簡單模型將為將來更復雜的學習打下良好基礎。
線性回歸可以很好地回答以下問題:
· 兩個變量間有關系嗎?
· 關系有多強?
· 哪一個變量的影響最大?
· 預測的各個變量影響值能有多精確?
· 預測的目標值能有多精確?
· 其關系是線性的嗎?
· 是否有交互作用?
預估系數
假設僅有一個自變量和因變量,那么線性回歸表達如下:
一個自變量和因變量線性模型的方程式
在上圖的方程中,兩個β就是系數。在模型中預測結果需要用到這些系數。
那么,如何算出這些參數呢?
為此,需要最小化最小二乘法或者誤差平方和。當然,線性模型也不是完美的,也不能準確預測出所有數據,這就意味著實際值和預測值間存在差異。該誤差能用以下方程簡單算出:
實際值減去預測值
但為什么要平方誤差呢?
平方誤差,是因為預測值可能大于也可能小于實際值,從而分別產生負或正的誤差。如果沒有平方誤差值,誤差的數值可能會因為正負誤差相消而變小,而并非因為模型擬合好。
此外,平方誤差會加大誤差值,所以最小化平方誤差可以保證模型更好。
下圖有助于更好地理解這個概念:
線性擬合數據集
在上述圖表中,紅點是實際值,而藍線是線性模型。灰線展現了預測值和實際值之間的誤差。因此,藍線就是灰線長度平方的最小值。
經過一系列超出本文難度的數學計算,最終可以得到以下這個方程式,用以計算參數。
x和y代表平均值
預估系數的相關性
目前已得知系數,那么如何證明系數與因變量是否相關?
最好的方法就是找到p值。p值被用于量化數據的重要性,它能判斷零假設是否被否定。
什么是零假設?
所有建模任務都是在自變量和因變量存在一定關聯的假設下進行的。而零假設則正好相反,也就是說自變量和因變量之間沒有任何關聯。
因此,算出每一個系數的p值就能得知,從數據值上來說,該變量對于預估因變量是否重要。一般來說,如果p值小于0.05,那么自變量和因變量就之間存在強烈關系。
評估模型的準確性
通過找出p值,從數據值上來說,自變量是非常重要的。
如何得知該線性模型是擬合好呢?
通常使用RSE(殘差標準差)和 R2 來評估模型。
RSE計算公式
R2計算公式
第一個誤差度量很容易理解:殘差越小,模型數據擬合越好(在這種情況下,數據越接近線性關系)。
R2可以衡量因變量的變化比例,并用自變量x表述。因此,假設在一個線性方程中,自變量x可以解釋因變量,那么變化比例就高, R2 將接近1。反之,則接近0。
多元線性回歸理論
在現實生活中,不會出現一個自變量預測因變量的情況。所以,線性回歸模型是一次只分析一個自變量嗎?當然不是了,實際情況中采取多元線性回歸。
該方程式和一元線性回歸方程很像,只不過是再加上預測數和相應的系數。
多元線性回歸等式。p表示自變量的個數。
評估自變量的相關性
在前文中,通過找出p值來評估一元線性回歸中自變量的相關性。在多元線性回歸中,F統計量將被用于評估相關性。
F統計量計算公式。n表示數據量,p表示自變量的個數。
F統計量在整個方程中計算,而p值則針對特定的自變量。如果兩者有強烈的相關性,F大于1。相反,F大約等于1。
比1大多少是足夠大呢?
這是一個很難回答的問題。通常,如果數據中有一個很大的數值的話,F可以僅比1大一點點,而又代表了強烈的相關性。如果數據集中的數據量很小的話,F值一定要比1大很多,才能表示強烈的相關性。
為什么在這種情況下不能使用p值呢?
因為我們擬合了許多自變量,所以我們需要考慮一個有很多自變量的情況(p值很大)。當自變量的數量較大時,通常會有大約5%的自變量的p值會很小——即使它們在統計上并不顯著。因此,我們使用F統計量來避免將不重要的自變量視為重要的自變量。
評估模型準確性
和一元線性回歸模型一樣,多元線性回歸模型的準確性也可以用R2來評估。然而,需要注意的是,隨著自變量數量的增加,R2的數值也會增大。這是因為模型必然和訓練數據擬合得更好。
但是,這并不意味著該模型在測試數據上(預測未知數據時)也會有很好的表現。
增加干擾
在線性模型中,多元自變量意味著其中一些自變量會對其他自變量產生影響。
比如說,已知一個人年齡和受教育年數,去預測她的薪資。很明顯,年齡越大,受教育時長就越長。那么,在建模時,要怎樣處理這種干擾呢?
以兩個自變量為例:
多元線性回歸中的干擾
從上式可知,我們將兩個自變量相乘,得到一個新的系數。從簡化的公式中可以看到,該系數受到另一個特征值的影響。
通常來說,在將干擾模型考慮在內時,也需要考慮個體特征的影響,即使在p值不重要時也要這么做。這就是分層遞階原則。該原則背后的根據是,如果兩個自變量互相干擾,那么將它們個體影響考慮在內將會對建模有很小的影響。
以上就是線性回歸的基本原理。接下來本文將介紹如何在Python中實現一元線性回歸和多元線性回歸,以及如何評估兩種模型的模型參數質量和模型整體表現。
代碼和數據傳送門:https://github.com/marcopeix/ISL-linear-regression
強烈建議讀者在閱讀本文之后動手在Jupyter notebook上復現整個過程,這將有助于讀者充分理解和利用該教程。
那么開始吧!
本文用到的數據集包括在電視、廣播和報紙上花費的廣告費用及各自帶來的銷售額。
該實驗旨在利用線性代數了解廣告費用對銷售額的影響。
導入庫
利用Python編程有一個好處,就是它可以提供多個庫的渠道,使得我們可以快速讀取數據、繪制數據和執行線性回歸。
筆者習慣于將所有必要的庫放在代碼的開頭,使代碼井然有序。導入:
import pandas as pdimport numpy as np import matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegressionfrom 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()可以得到:
線性擬合
從上圖可以發現,一元線性回歸模型似乎就可以大致解釋電視廣告費用對銷售額的影響。
評估模型相關性
接下來是檢驗一個模型表現是否良好,需要查看它的R2值和每個系數的p值。
輸入以下代碼:
X = data['TV']y = data['sales'] X2 = sm.add_constant(X)est = sm.OLS(y, X2)est2 = est.fit()print(est2.summary())可以得到如下輸出:
R2值和p值
觀察兩個系數可以發現,p值雖然并不一定是0,但是非常低。這意味著這些系數和目標值(此處即銷售額)之間有很強烈的聯系。
同時可以觀察到,R2值為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統計量、R2值以及每個系數的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())可以得到:
R2值,p值和F統計量
可以看到,多元線性回歸模型的R2值比一元線性回歸模型要高得多,達到了0.897!
其F統計量為570.3。這比1要大得多。由于本文使用的數據集比較小(只有200個數據),這說明廣告花費和銷售額之間有強烈的聯系。
最后,由于本文只用了三個自變量可以利用p值來衡量它們是否與模型相關。從上表可以發現,第三個系數(即報紙廣告的系數)的p值比另外兩個要大。這說明從數據來看,報紙廣告花費并不重要。去除這個自變量可能會使R2有輕微下降,但是可以幫助得到更加準確的預測結果。
線性回歸模型也許不是表現最好的模型,但了解線性回歸是非常重要的,這將幫助我們打好基礎,理解更加復雜的統計學方法。
留言 點贊 關注
我們一起分享AI學習與發展的干貨
總結
以上是生活随笔為你收集整理的Python 散点图线性拟合_一文教你全面掌握用Python实现线性回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux中如何查看环境变量
- 下一篇: 基于Java毕业设计养老院老人安全管理源