溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Python中編程線性回歸模型

發(fā)布時間:2021-12-27 10:35:23 來源:億速云 閱讀:172 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“如何在Python中編程線性回歸模型”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何在Python中編程線性回歸模型”吧!

可解釋性是機器學習中最大的挑戰(zhàn)之一。如果一個模型的決策更容易讓人理解,那么它的解釋性就會比另一個模型高。有些模型是如此復雜,并且內(nèi)部結(jié)構如此復雜,以至于幾乎無法理解它們是如何達到最終結(jié)果的。這些黑匣子似乎打破了原始數(shù)據(jù)和最終輸出之間的關聯(lián),因為它們之間發(fā)生了多個過程。

但是在機器學習算法領域,某些模型比其他模型更透明。 決策樹 絕對是其中之一,而線性回歸模型又是其中之一。它們的簡單和直接的方法使它們成為解決不同問題的理想工具。讓我們看看如何。

您可以使用線性回歸模型來分析給定地點的薪水如何取決于經(jīng)驗,學歷,職位,所工作的城市等特征。同樣,您可以分析房地產(chǎn)價格是否取決于面積,臥室數(shù)量或距市中心的距離等因素。

簡單線性回歸(SLR)

 
當輸出變量(目標)只有一個輸入變量(預測變量)時,這是最簡單的線性回歸形式:

  • 輸入 或 預測變量 是變量,可幫助預測輸出變量的值。它通常被稱為 X。

  • 輸出  目標變量 是我們要預測的變量。通常稱為 y

如何在Python中編程線性回歸模型

β0的值( 也稱為截距)顯示估算的回歸線與y 軸交叉的點 ,而β1 的值 確定 估算的回歸線的斜率。的 隨機誤差 描述因變量和自變量(該模型的擾動,部分之間的線性關系的隨機分量 ? 該 無法解釋)。真正的回歸模型通常是未知的(因為我們無法捕獲影響因變量的所有影響),因此與觀察到的數(shù)據(jù)點相對應的隨機誤差項的值仍然未知。但是,可以通過為觀察到的數(shù)據(jù)集計算模型的參數(shù)來估計回歸模型。

回歸背后的想法是 從樣本中估計參數(shù) β0 和 β1。如果我們能夠確定這兩個參數(shù)的最佳值,則在給定X的值的情況下,我們將具有 最佳擬合線, 可用于預測 y的值 。換句話說,我們嘗試擬合一條線以觀察輸入變量和輸出變量之間的關系,然后進一步使用它來預測未見輸入的輸出。

如何在Python中編程線性回歸模型

我們?nèi)绾喂烙?nbsp;β0 和 β1?我們可以使用一種稱為 普通最小二乘(OLS)的方法 這樣做的目的是使黑點到紅線的距離盡可能接近零,這是通過最小化實際結(jié)果與預測結(jié)果之間的平方差來實現(xiàn)的。

實際值和預測值之間的差異稱為 殘差(e) ,取決于模型是高估還是低估了結(jié)果,可以是負值或正值。因此,為了計算凈誤差,直接將所有殘差相加會導致項的抵消和凈效應的減小。為了避免這種情況,我們采用這些誤差項的平方和,稱為 殘差平方和(RSS)。

如何在Python中編程線性回歸模型

普通最小二乘法(OLS)方法最小化的平方的總和殘留,其目的在于以適合的回歸直線,將最小化來自觀測值的距離(以二次值測量)到預測者(回歸線)。

多元線性回歸(MLR)

 
 存在兩個或多個預測變量或輸入變量時使用的線性回歸形式。與之前描述的SLR模型類似,它包含其他預測變量:

如何在Python中編程線性回歸模型

注意,該方程只是簡單線性回歸方程的一種擴展,其中每個輸入/預測變量都有其對應的斜率系數(shù) (β 。第一個 β 項 (β0) 是截距常數(shù),是 在沒有所有預測變量的情況下(即,當所有 X 項均為0時)的y值 。

隨著功能部件數(shù)量的增加,我們模型的復雜性也隨之增加,并且更加難以可視化甚至理解我們的數(shù)據(jù)。由于與SLR相比,這些模型中的參數(shù)更多,因此需要更多注意。與他們一起工作時。添加更多術語會從本質(zhì)上改善數(shù)據(jù)的擬合度,但是新術語可能沒有任何實際意義。這很危險,因為它可能會導致模型適合該數(shù)據(jù),但實際上并不意味著有用。

一個例子

 
廣告數(shù)據(jù)集包括產(chǎn)品在200個不同市場中的銷售以及三種不同媒體(電視,廣播和報紙)的廣告預算。我們將使用數(shù)據(jù)集根據(jù)電視,廣播和報紙的廣告預算(自變量)來預測銷售量(自變量)。

在數(shù)學上,我們將嘗試解決的公式是:

如何在Python中編程線性回歸模型

 通過最小化誤差函數(shù)并擬合最佳直線或超平面(取決于輸入變量的數(shù)量,回歸模型可以找到這些常數(shù)(β)的值 。讓我們編碼。

加載數(shù)據(jù)并描述數(shù)據(jù)集

 
在加載數(shù)據(jù)之前,我們將導入必要的庫:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import metrics
from sklearn.metrics import r2_score
import statsmodels.api as sm

現(xiàn)在我們加載數(shù)據(jù)集:

df = pd.read_csv(“Advertising.csv”)

讓我們了解數(shù)據(jù)集并對其進行描述:

df.head()

如何在Python中編程線性回歸模型

由于不需要它,我們將刪除第一列(“未命名”):

df = df.drop([‘Unnamed: 0’], axis=1)
df.info()

現(xiàn)在,我們的數(shù)據(jù)集包含4列(包括目標變量“ sales”),200個寄存器,并且沒有缺失值。讓我們可視化自變量和目標變量之間的關系。

sns.pairplot(df)

如何在Python中編程線性回歸模型

電視與銷售之間的關系似乎很牢固,雖然廣播與銷售之間似乎存在某種趨勢,但報紙與銷售之間的關系似乎不存在。我們也可以通過相關圖來數(shù)值驗證:

mask = np.tril(df.corr())
sns.heatmap(df.corr(), fmt=’.1g’, annot=True, cmap= ‘cool’, mask=mask)

如何在Python中編程線性回歸模型

正如我們預期的那樣,最強的正相關關系發(fā)生在銷售和電視之間,而銷售和報紙之間的關系則接近于0。

選擇特征和目標變量

 
接下來,我們將變量分為兩組:因變量(或目標變量“ y”)和獨立變量(或特征變量“ X”)

X = df.drop([‘sales’], axis=1)
y = df[‘sales’]

分割數(shù)據(jù)集

 
為了了解模型的性能,將數(shù)據(jù)集分為訓練集和測試集是一個很好的策略。通過將數(shù)據(jù)集分為兩個單獨的集合,我們可以使用一個集合進行訓練,而使用另一集合中的看不見的數(shù)據(jù)來測試模型的性能。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

我們將數(shù)據(jù)集分為70%訓練和30%測試。random_state參數(shù)用于初始化內(nèi)部隨機數(shù)生成器,它將根據(jù)您的情況決定將數(shù)據(jù)拆分為訓練索引和測試索引。我將隨機狀態(tài)設置為0,以便您可以使用同一參數(shù)在多個代碼運行中比較輸出。

print(X_train.shape,y_train.shape,X_test.shape,y_test.shape)

如何在Python中編程線性回歸模型


通過打印分割集的形狀,我們看到我們創(chuàng)建了:

  • 2個數(shù)據(jù)集,每個140個寄存器(占總寄存器的70%),一個包含3個獨立變量,一個僅包含目標變量的數(shù)據(jù)集,將用于 訓練 和生成線性回歸模型。

  • 2個數(shù)據(jù)集,每個數(shù)據(jù)集60個寄存器(占總寄存器的30%),一個數(shù)據(jù)集包含3個獨立變量,一個僅包含目標變量,這些數(shù)據(jù)集將用于 測試 線性回歸模型的性能。

建立模型

 
建立模型非常簡單:

mlr = LinearRegression()

訓練模型

 
使模型適合訓練數(shù)據(jù)代表了建模過程中的訓練部分。訓練后,可以使用預測方法調(diào)用該模型來進行預測:

mlr.fit(X_train, y_train)coeff_df = pd.DataFrame(mlr.coef_, X.columns, columns =[‘Coefficient’])
coeff_df

讓我們看一下訓練后模型的輸出,并看一下β0的值  (截距):

mlr.intercept_

如何在Python中編程線性回歸模型

我們還可以打印系數(shù)(β)的值 :

coeff_df = pd.DataFrame(mlr.coef_, X.columns, columns =[‘Coefficient’])
coeff_df

如何在Python中編程線性回歸模型

這樣,我們現(xiàn)在可以根據(jù)電視,廣播和報紙的不同預算值來估算“銷售”的價值:

如何在Python中編程線性回歸模型

例如,如果我們確定電視的預算值為50,廣播的預算值為30,報紙的預算值為10,則“銷售”的估算值將為:

example = [50, 30, 10]
output = mlr.intercept_ + sum(example*mlr.coef_)
output

如何在Python中編程線性回歸模型

測試模型

 
測試數(shù)據(jù)集是獨立于訓練數(shù)據(jù)集的數(shù)據(jù)集。該測試數(shù)據(jù)集是您模型的看不見的數(shù)據(jù)集,有助于您更好地了解其概括能力:

y_pred = mlr.predict(X_test)

評估表現(xiàn)

 
模型的質(zhì)量與預測與測試數(shù)據(jù)集的實際值的匹配程度有關:

print(‘Mean Absolute Error:’, metrics.mean_absolute_error(y_test, y_pred))
print(‘Mean Squared Error:’, metrics.mean_squared_error(y_test, y_pred))
print(‘Root Mean Squared Error:’, np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
print(‘R Squared Score is:’, r2_score(y_test, y_pred))

如何在Python中編程線性回歸模型

在根據(jù)測試集驗證我們的模型后,我們得到的R2為0.86,這似乎是相當不錯的性能得分。但是,盡管較高的R2表示更適合該模型,但并非總是如此。我們將在下面看到一些解釋和改進回歸模型的方法。

如何解釋和改善您的模型?

 
好的,我們創(chuàng)建了模型,現(xiàn)在呢?讓我們看一下訓練數(shù)據(jù)上的模型統(tǒng)計信息,以獲得一些答案:

X2 = sm.add_constant(X_train)
model_stats = sm.OLS(y_train.values.reshape(-1,1), X2).fit()
model_stats.summary()

如何在Python中編程線性回歸模型

下面讓我們看看這些數(shù)字的含義。

假設檢驗

 
運行MLR模型時,您應該回答的基本問題之一是, 至少有一個預測變量對預測輸出有用。如果自變量和目標之間的關系僅僅是偶然的,并且由于任何預測因素而對銷售沒有實際影響,該怎么辦?

我們需要執(zhí)行假設檢驗來回答這個問題并檢查我們的假設。這一切都始于形成一個 零假設(H0),該假設指出所有系數(shù)都等于零,并且預測變量和目標變量之間沒有關系(這意味著沒有自變量的模型既適合數(shù)據(jù)又適合您的模型):

如何在Python中編程線性回歸模型

另一方面,我們需要定義 替代假設(Ha),該假設指出至少一個系數(shù)不為零,并且預測變量和目標之間存在關系(這意味著模型比截距更適合數(shù)據(jù)僅限型號):

如何在Python中編程線性回歸模型

如果我們想拒絕零假設并對我們的回歸模型有信心,我們需要找到有力的統(tǒng)計證據(jù)。為此,我們執(zhí)行假設檢驗,為此我們使用 F統(tǒng)計量。

如果F統(tǒng)計量的值等于或非常接近1,則結(jié)果支持零假設,我們無法拒絕它。

正如我們在上表中看到的(以黃色標記),F(xiàn)統(tǒng)計量為439.9,因此有力地證明了零假設(所有系數(shù)均為零)。接下來,我們還需要 在原假設為真(8.76e-70)(小于1%的極小的數(shù)字)的假設下,檢查 F統(tǒng)計量(也用黃色標記)的發(fā)生概率。這意味著在有效的Null假設的假設下,偶然發(fā)生F統(tǒng)計量439.9的可能性要小于1%。

話雖如此,我們可以否定零假設,并相信至少有一個預測變量可用于預測輸出。

產(chǎn)生模型

 
運行包含許多不相關變量的線性回歸模型將導致不必要的復雜模型。哪些預測指標很重要?它們對我們的模型都重要嗎?為了找出答案,我們需要執(zhí)行一個稱為功能選擇的過程 。 特征選擇的2種主要方法是:

  1. 正向選擇: 從與變量相關性最高的預測變量開始,一次添加一個預測變量。然后,將具有更大理論重要性的變量順序合并到模型中,直到達到停止規(guī)則為止。

  2. 向后消除: 從模型中的所有變量開始,然后刪除統(tǒng)計上意義最小的變量(較大的p值),直到達到停止規(guī)則為止。

盡管兩種方法都可以使用,但是除非預測變量的數(shù)量大于樣本大?。ɑ蚴录臄?shù)量),否則通常首選使用向后消除方法。

假設條件

 
由于線性回歸模型是任何事件的長期序列的近似,因此它們需要對它們表示的數(shù)據(jù)進行一些假設才能保持適當。大多數(shù)統(tǒng)計檢驗都依賴于有關分析中使用的變量的某些假設,如果不滿足這些假設,則結(jié)果可能不可信(例如,導致I型或II型錯誤)。

從輸出是輸入變量的線性組合的意義上講,線性回歸模型是線性的,并且僅適用于對線性可分離數(shù)據(jù)進行建模。線性回歸模型在各種假設下工作,這些假設必須存在才能產(chǎn)生適當?shù)墓烙?,而不僅僅是依賴于準確性得分:

  • 線性:特征與目標之間的關系必須是線性的。檢查線性關系的一種方法是目視檢查散點圖的線性。如果散點圖中顯示的關系不是線性的,那么我們需要運行非線性回歸或轉(zhuǎn)換數(shù)據(jù)。

  • 方差:對于任何x值,殘差的方差必須相同。多元線性回歸假設殘差的誤差量在線性模型的每個點都相似。這種情況稱為同調(diào)。散點圖是檢查數(shù)據(jù)是否為同方差的好方法,并且還存在一些測試以數(shù)值驗證該假設(例如,Goldfeld-Quandt,Breusch-Pagan,White)

如何在Python中編程線性回歸模型

  • 無多重共線性: 數(shù)據(jù)不應顯示多重共線性,當自變量(解釋變量)彼此高度相關時,就會發(fā)生多重共線性。如果發(fā)生這種情況,將很難找出導致因變量/目標變量差異的特定變量??梢允褂梅讲钆蛎浺蜃樱╒IF)方法或通過相關矩陣來檢驗此假設。解決此問題的替代方法可能是將數(shù)據(jù)居中(扣除平均得分),或進行因子分析并旋轉(zhuǎn)因子以確保線性回歸分析中因子的獨立性。

  • 無自相關:殘差的值應彼此獨立。殘差中存在相關性會大大降低模型的準確性。如果誤差項相關,則估計的標準誤差往往會低估真實的標準誤差。要測試此假設,可以使用Durbin-Watson統(tǒng)計信息。

  • 殘差的正態(tài)性:殘差必須正態(tài)分布??梢允褂脭M合優(yōu)度檢驗(例如Kolmogorov-Smirnov或Shapiro-Wilk檢驗)來檢查正態(tài)性,如果數(shù)據(jù)不是正態(tài)分布的,則非線性轉(zhuǎn)換(例如對數(shù)轉(zhuǎn)換)可以解決此問題。

如何在Python中編程線性回歸模型

假設是至關重要的,因為如果假設無效,那么分析過程將被認為是不可靠,不可預測且不受控制的。不符合這些假設會導致得出無效的結(jié)論或數(shù)據(jù)在科學上沒有依據(jù)。 

最后的想法

 
盡管MLR模型擴展了SLR模型的范圍,但它們?nèi)匀皇蔷€性模型,這意味著模型中包含的術語無法顯示彼此之間的任何非線性關系或表示任何種類的非線性趨勢。在預測要素的觀察范圍之外的點時也應小心,因為變量之間的關系可能會隨著您移出觀察范圍而改變(這是您沒有數(shù)據(jù)的原因而無法知道的事實)。

觀察到的關系可能是局部線性的,但是在數(shù)據(jù)的外部范圍上可能存在未觀察到的非線性關系。

線性模型還可以 通過包含非線性變量(例如多項式)和變換指數(shù)函數(shù)來對曲率建模。線性回歸方程的參數(shù)是 線性的 ,這意味著您可以通過指數(shù)增加自變量以擬合曲線,但仍保留在“線性世界”中。線性回歸模型可以包含對數(shù)項和逆項,以遵循不同類型的曲線,但參數(shù)仍保持線性。

如何在Python中編程線性回歸模型 盡管自變量是平方的,但是模型的參數(shù)仍然是線性的

諸如多項式回歸之類的 回歸 可以對非線性關系進行建模 ,而線性方程式具有一種基本形式,而非線性方程式可以采用許多不同形式。您可能會考慮使用 非線性回歸模型的原因 是,盡管線性回歸可以對曲線進行建模,但它可能無法對數(shù)據(jù)中存在的特定曲線進行建模。

您還應該知道,OLS并不是擬合線性回歸模型的唯一方法,而其他優(yōu)化方法(如 Gradient Descent) 更適合于大型數(shù)據(jù)集。將OLS應用于復雜和非線性算法可能無法擴展,并且Gradient Descent在計算上可能更便宜(更快)以找到解決方案。 梯度下降(Gradient Descent)是一種使函數(shù)最小化的算法,并且在給定由一組參數(shù)定義的函數(shù)的情況下,該算法從一組初始參數(shù)值開始,然后逐步向一組參數(shù)值最小化該函數(shù)。這個 迭代最小化 是使用衍生物來實現(xiàn),以在功能梯度的負方向的步驟。

如何在Python中編程線性回歸模型 

 使用梯度下降的線性回歸

要考慮的另一項關鍵是, 離群值會對回歸線和相關系數(shù)產(chǎn)生巨大影響 。為了識別它們,執(zhí)行 探索性數(shù)據(jù)分析(EDA),檢查數(shù)據(jù)以檢測異常觀察非常重要,因為它們會以極大的方式影響我們的分析和統(tǒng)計建模的結(jié)果。如果您識別出任何異常,則可以對異常值進行估算(例如,使用均值/中位數(shù)/眾數(shù)),設置上限(替換超出某些限制的那些值)或替換為缺失值并進行預測。

最后,線性回歸模型的一些 局限性 是:

  • 省略的變量。必須有一個良好的理論模型來提出解釋因變量的變量。在簡單的二變量回歸的情況下,必須考慮可能解釋因變量的其他因素,因為可能會有其他“未觀察到的”變量解釋輸出。

  • 反向因果關系。許多理論模型都預測雙向因果關系-即因變量可能導致一個或多個解釋變量發(fā)生變化。例如,更高的收入可能使人們能夠?qū)ψ约旱慕逃M行更多的投資,從而增加了他們的收入。這使估計回歸的方式變得復雜,需要特殊的技術。

  • 測量錯誤??赡軙e誤地評估因素。例如,能力很難測量,并且智商測試存在眾所周知的問題。結(jié)果,使用智商的回歸可能無法適當?shù)乜刂撇拍?,導致教育和收入等變量之間的關系不準確或有偏見。

  • 焦點太有限了?;貧w系數(shù)僅提供有關一個變量中的微小變化(而不是大變化)與另一變量中的變化之間的關系的信息。它會顯示出教育的微小變化可能會如何影響收入,但不會使研究人員對較大變化的影響進行概括。如果每個人都同時接受大學教育,那么剛畢業(yè)的大學畢業(yè)生就不太可能賺更多的錢,因為大學畢業(yè)生的總供應量將大大增加。

感謝各位的閱讀,以上就是“如何在Python中編程線性回歸模型”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對如何在Python中編程線性回歸模型這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI