天天看點

python線性回歸_一文教你全面掌握用Python實作線性回歸

全文共4968字,預計學習時長15分鐘或更長

python線性回歸_一文教你全面掌握用Python實作線性回歸

本文旨在為讀者了解和應用線性回歸時提供參考。雖然線性回歸算法很簡單,但是隻有少數人能真正了解其基本原則。

本文首先會深入挖掘線性回歸理論,了解其内在的工作機制,然後利用Python實作該算法,為商業問題模組化。

python線性回歸_一文教你全面掌握用Python實作線性回歸

理論

線性回歸或許是學習統計學最簡單的方法。在學習更進階的方法之前,這是一個很好的入門方法。事實上,許多更進階的方法可被視為線性回歸的延伸。是以,了解好這一簡單模型将為将來更複雜的學習打下良好基礎。

線性回歸可以很好地回答以下問題:

· 兩個變量間有關系嗎?

· 關系有多強?

· 哪一個變量的影響最大?

· 預測的各個變量影響值能有多精确?

· 預測的目标值能有多精确?

· 其關系是線性的嗎?

· 是否有互動作用?

預估系數

假設僅有一個自變量和因變量,那麼線性回歸表達如下:

python線性回歸_一文教你全面掌握用Python實作線性回歸

一個自變量和因變量線性模型的方程式

在上圖的方程中,兩個β就是系數。在模型中預測結果需要用到這些系數。

那麼,如何算出這些參數呢?

為此,需要最小化最小二乘法或者誤差平方和。當然,線性模型也不是完美的,也不能準确預測出所有資料,這就意味着實際值和預測值間存在差異。該誤差能用以下方程簡單算出:

python線性回歸_一文教你全面掌握用Python實作線性回歸

實際值減去預測值

但為什麼要平方誤差呢?

平方誤差,是因為預測值可能大于也可能小于實際值,進而分别産生負或正的誤差。如果沒有平方誤內插補點,誤差的數值可能會因為正負誤差相消而變小,而并非因為模型拟合好。

此外,平方誤差會加大誤內插補點,是以最小化平方誤差可以保證模型更好。

下圖有助于更好地了解這個概念:

python線性回歸_一文教你全面掌握用Python實作線性回歸

線性拟合資料集

在上述圖表中,紅點是實際值,而藍線是線性模型。灰線展現了預測值和實際值之間的誤差。是以,藍線就是灰線長度平方的最小值。

經過一系列超出本文難度的數學計算,最終可以得到以下這個方程式,用以計算參數。

python線性回歸_一文教你全面掌握用Python實作線性回歸
python線性回歸_一文教你全面掌握用Python實作線性回歸

x和y代表平均值

預估系數的相關性

目前已得知系數,那麼如何證明系數與因變量是否相關?

最好的方法就是找到p值。p值被用于量化資料的重要性,它能判斷零假設是否被否定。

什麼是零假設?

所有模組化任務都是在自變量和因變量存在一定關聯的假設下進行的。而零假設則正好相反,也就是說自變量和因變量之間沒有任何關聯。

是以,算出每一個系數的p值就能得知,從資料值上來說,該變量對于預估因變量是否重要。一般來說,如果p值小于0.05,那麼自變量和因變量就之間存在強烈關系。

評估模型的準确性

通過找出p值,從資料值上來說,自變量是非常重要的。

如何得知該線性模型是拟合好呢?

通常使用RSE(殘差标準差)和 R 來評估模型。

python線性回歸_一文教你全面掌握用Python實作線性回歸

RSE計算公式

python線性回歸_一文教你全面掌握用Python實作線性回歸

R計算公式

第一個誤差度量很容易了解:殘差越小,模型資料拟合越好(在這種情況下,資料越接近線性關系)。

R可以衡量因變量的變化比例,并用自變量x表述。是以,假設在一個線性方程中,自變量x可以解釋因變量,那麼變化比例就高, R 将接近1。反之,則接近0。

python線性回歸_一文教你全面掌握用Python實作線性回歸

多元線性回歸理論

在現實生活中,不會出現一個自變量預測因變量的情況。是以,線性回歸模型是一次隻分析一個自變量嗎?當然不是了,實際情況中采取多元線性回歸。

該方程式和一進制線性回歸方程很像,隻不過是再加上預測數和相應的系數。

python線性回歸_一文教你全面掌握用Python實作線性回歸

多元線性回歸等式。p表示自變量的個數。

評估自變量的相關性

在前文中,通過找出p值來評估一進制線性回歸中自變量的相關性。在多元線性回歸中,F統計量将被用于評估相關性。

python線性回歸_一文教你全面掌握用Python實作線性回歸

F統計量計算公式。n表示資料量,p表示自變量的個數。

F統計量在整個方程中計算,而p值則針對特定的自變量。如果兩者有強烈的相關性,F大于1。相反,F大約等于1。

比1大多少是足夠大呢?

這是一個很難回答的問題。通常,如果資料中有一個很大的數值的話,F可以僅比1大一點點,而又代表了強烈的相關性。如果資料集中的資料量很小的話,F值一定要比1大很多,才能表示強烈的相關性。

為什麼在這種情況下不能使用p值呢?

因為我們拟合了許多自變量,是以我們需要考慮一個有很多自變量的情況(p值很大)。當自變量的數量較大時,通常會有大約5%的自變量的p值會很小——即使它們在統計上并不顯著。是以,我們使用F統計量來避免将不重要的自變量視為重要的自變量。

評估模型準确性

和一進制線性回歸模型一樣,多元線性回歸模型的準确性也可以用R來評估。然而,需要注意的是,随着自變量數量的增加,R的數值也會增大。這是因為模型必然和訓練資料拟合得更好。

但是,這并不意味着該模型在測試資料上(預測未知資料時)也會有很好的表現。

增加幹擾

線上性模型中,多元自變量意味着其中一些自變量會對其他自變量産生影響。

比如說,已知一個人年齡和受教育年數,去預測她的薪資。很明顯,年齡越大,受教育時長就越長。那麼,在模組化時,要怎樣處理這種幹擾呢?

以兩個自變量為例:

python線性回歸_一文教你全面掌握用Python實作線性回歸

多元線性回歸中的幹擾

從上式可知,我們将兩個自變量相乘,得到一個新的系數。從簡化的公式中可以看到,該系數受到另一個特征值的影響。

通常來說,在将幹擾模型考慮在内時,也需要考慮個體特征的影響,即使在p值不重要時也要這麼做。這就是分層遞階原則。該原則背後的根據是,如果兩個自變量互相幹擾,那麼将它們個體影響考慮在内将會對模組化有很小的影響。

以上就是線性回歸的基本原理。接下來本文将介紹如何在Python中實作一進制線性回歸和多元線性回歸,以及如何評估兩種模型的模型參數品質和模型整體表現。

強烈建議讀者在閱讀本文之後動手在Jupyter notebook上複現整個過程,這将有助于讀者充分了解和利用該教程。

python線性回歸_一文教你全面掌握用Python實作線性回歸

那麼開始吧!

本文用到的資料集包括在電視、廣播和報紙上花費的廣告費用及各自帶來的銷售額。

該實驗旨在利用線性代數了解廣告費用對銷售額的影響。

導入庫

利用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()

得到結果如下:

python線性回歸_一文教你全面掌握用Python實作線性回歸

可以看到,“未命名:0”列是多餘的。是以,我們把這一列删除。

data.drop(['Unnamed: 0'], axis=1)

現在資料已經清理完畢,可以運作線性回歸了!

python線性回歸_一文教你全面掌握用Python實作線性回歸

簡單線性回歸

模組化

使用簡單線性回歸模組化時,這裡隻考慮電視廣告對銷售額的影響。在正式模組化之前,首先檢視一下資料。

可以利用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()

運作上述代碼,可以得到下圖:

python線性回歸_一文教你全面掌握用Python實作線性回歸

電視廣告費用和銷售額散點圖

從圖中可以看到,電視廣告費用和銷售額明顯相關。

基于此資料,可以得出線性近似。操作如下:

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]))

就這麼簡單?

對的!對資料集給出一條拟合直線并檢視等式參數就是這麼簡單。在該案例中,可以得到:

python線性回歸_一文教你全面掌握用Python實作線性回歸

一進制線性回歸等式

接下來将資料拟合線可視化。

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()

可以得到:

python線性回歸_一文教你全面掌握用Python實作線性回歸

線性拟合

從上圖可以發現,一進制線性回歸模型似乎就可以大緻解釋電視廣告費用對銷售額的影響。

評估模型相關性

接下來是檢驗一個模型表現是否良好,需要檢視它的R值和每個系數的p值。

輸入以下代碼:

X = data['TV']y = data['sales']

X2 = sm.add_constant(X)est = sm.OLS(y, X2)est2 = est.fit()print(est2.summary())

可以得到如下輸出:

python線性回歸_一文教你全面掌握用Python實作線性回歸

R值和p值

觀察兩個系數可以發現,p值雖然并不一定是0,但是非常低。這意味着這些系數和目标值(此處即銷售額)之間有很強烈的聯系。

同時可以觀察到,R值為0.612。這說明大約60%的銷售額變化是可以由電視廣告花費來解釋的。這樣的結果是合理的。但是,這一定不是可以用來準确預測銷售額的最好的結果。在報紙和廣播廣告上的花費必定對銷售額有一定的影響。

接下來将檢測多元線性回歸模型是否能取得更好的結果。

python線性回歸_一文教你全面掌握用Python實作線性回歸

多元線性回歸

模組化

和一進制線性回歸的模組化過程一樣,定義特征值和目标變量,并利用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]))

就是這麼簡單!根據上述代碼可以得到如下等式:

python線性回歸_一文教你全面掌握用Python實作線性回歸

多元線性回歸等式

當然,由于一共有四個變量,這裡無法把三種廣告媒介對銷售額的影響可視化,那将需要一個四維圖形。

需要注意的是,報紙的系數是負數,并且很小。這和模型有關嗎?為了回答這個問題,我們需要計算模型的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())

可以得到:

python線性回歸_一文教你全面掌握用Python實作線性回歸

R值,p值和F統計量

可以看到,多元線性回歸模型的R值比一進制線性回歸模型要高得多,達到了0.897!

其F統計量為570.3。這比1要大得多。由于本文使用的資料集比較小(隻有200個資料),這說明廣告花費和銷售額之間有強烈的聯系。

最後,由于本文隻用了三個自變量可以利用p值來衡量它們是否與模型相關。從上表可以發現,第三個系數(即報紙廣告的系數)的p值比另外兩個要大。這說明從資料來看,報紙廣告花費并不重要。去除這個自變量可能會使R有輕微下降,但是可以幫助得到更加準确的預測結果。

線性回歸模型也許不是表現最好的模型,但了解線性回歸是非常重要的,這将幫助我們打好基礎,了解更加複雜的統計學方法。

python線性回歸_一文教你全面掌握用Python實作線性回歸

留言 點贊 關注

我們一起分享AI學習與發展的幹貨