Python線性回歸圖文實例詳解_第1頁
Python線性回歸圖文實例詳解_第2頁
Python線性回歸圖文實例詳解_第3頁
Python線性回歸圖文實例詳解_第4頁
Python線性回歸圖文實例詳解_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

第Python線性回歸圖文實例詳解線性回歸模型屬于經(jīng)典的統(tǒng)計學模型,該模型的應用場景是根據(jù)已知的變量(即自變量)來預測某個連續(xù)的數(shù)值變量(即因變量)。例如餐廳根據(jù)媒體的營業(yè)數(shù)據(jù)(包括菜譜價格、就餐人數(shù)、預訂人數(shù)、特價菜折扣等)預測就餐規(guī)模或營業(yè)額;網(wǎng)站根據(jù)訪問的歷史數(shù)據(jù)(包括新用戶的注冊量、老用戶的活躍度、網(wǎng)站內(nèi)容的更新頻率等)預測用戶的支付轉(zhuǎn)化率;醫(yī)院根據(jù)患者的病歷數(shù)據(jù)(如體檢指標、藥物復用情況、平時的飲食習慣等)預測某種疾病發(fā)生的概率。

理解什么是線性回歸

線性回歸也被稱為最小二乘法回歸(LinearRegression,alsocalledOrdinaryLeast-Squares(OLS)Regression)。它的數(shù)學模型是這樣的:

y=a+b*x+e

其中,a被稱為常數(shù)項或截距;b被稱為模型的回歸系數(shù)或斜率;e為誤差項。a和b是模型的參數(shù)。

當然,模型的參數(shù)只能從樣本數(shù)據(jù)中估計出來:

y=a+b*x

我們的目標是選擇合適的參數(shù),讓這一線性模型最好地擬合觀測值。擬合程度越高,模型越好。

由于針對具體操作相關(guān)文檔太多,所以本文內(nèi)容涉及具體操作較少,主要是講方法。

本文內(nèi)所用到的包:

importpandasaspd

importmatplotlib.pyplotasplt

importnumpyasnp

importseabornassns

importscipy.statsasstats

importstatsmodels.apiassm

fromscipy.statsimportchi2_contingency

1.簡單線性回歸模型

也被稱為一元線性回歸模型,是指模型中只含有一個自變量和一個因變量

一般可以通過散點圖刻畫兩個變量之間的關(guān)系,并基于散點圖繪制簡單線性擬合線,進而使變量之間的關(guān)系體現(xiàn)地更加直觀

以經(jīng)典的剎車距離為例:

ccpp=pd.read_csv(cars.csv)

sns.set(font=getChineseFont(8).get_name())

sns.lmplot(x=speed,y=dist,data=ccpp,

legend_out=False,#將圖例呈現(xiàn)在圖框內(nèi)

truncate=True#根據(jù)實際的數(shù)據(jù)范圍,對擬合線做截斷操作

plt.show()

從散點圖來看,自變量speed與因變量dist之間存在明顯的正相關(guān),即剎車速度越大,剎車距離越長。圖內(nèi)的陰影部分為擬合線95%的置信區(qū)間,每個散點都是盡可能地圍繞在擬合線附近。

通過ols函數(shù)求得回歸模型的參數(shù)解y~s表示簡單線性回歸模型

fit=sm.formula.ols(dist~speed,data=ccpp).fit()

print(fit.params)#Intercept:-17.579095,speed:3.932409

因此,關(guān)于剎車距離的簡單線性模型為:

dist=-17.579095+3.932409speed

也就是說,剎車速度每提升一個單位,將促使剎車距離增加3.93個單位。

2.多元線性回歸模型

實際應用中,簡單線性回歸模型并不多見,因為影響因變量的自變量往往不止一個用于構(gòu)建多元線性回歸模型的數(shù)據(jù)實際上由兩部分組成:一個是一維的因變量y;另一個是二維矩陣的自變量x

以利潤表Profit為例,研究影響利潤的因素

表結(jié)構(gòu)如下:

profit=pd.read_csv(Profit.csv,sep=,)

fit=sm.formula.ols(Profit~RD_Spend+Administration+Marketing_Spend,data=profit).fit()

print(fit.params)#Intercept:50122.192990,RD_Spend:0.805715,Administration:-0.026816,Marketing_Spend:0.027228

不考慮模型的顯著性和回歸系數(shù)的顯著性,得到的回歸模型可以表示為:

Profit=50122.192990+0.805715RD_Spend-0.026816Administration+0.027228Marketing_Spend

但是,在實際應用中,單純的利用ols函數(shù)將偏回歸系數(shù)計算出來,并構(gòu)造一個多元線性回歸模型,得到的結(jié)果往往不是理想的,這時候需要借助于統(tǒng)計學中的F檢驗法和t檢驗法,完成模型的顯著性檢驗和回歸系數(shù)的顯著性檢驗。

2.1應用F檢驗法完成模型的顯著性檢驗

步驟如下:

提出問題的原假設和備擇假設;

在原假設的條件下,構(gòu)造統(tǒng)計量F;

根據(jù)樣本信息,計算統(tǒng)計量F的值;

對比統(tǒng)計量的值和理論值,如果計算的統(tǒng)計量值超過理論的值,則拒絕原假設,否則需要接受原假設

假設認為模型的所有偏回歸系數(shù)全為0(即認為沒有一個自變量可以構(gòu)成因變量的線性組合)

通常在實際的應用中將概率值p與0.05做比較,小于0.05則拒絕原假設,否則接受原假設

2.2應用t檢驗法完成回歸系數(shù)的顯著性檢驗

模型通過了顯著性檢驗,只能說明模型關(guān)于因變量的線性組合是合理的,但不能說明每個自變量對因變量都具有顯著意義,所以還要對模型的回歸系數(shù)做顯著性檢驗。

只有當回歸系數(shù)通過了t檢驗,才可以認為模型的系數(shù)是顯著的t檢驗的出發(fā)點就是驗證每一個自變量是否能夠成為影響因變量的重要因素t檢驗的原假設是假定第j變量的回歸系數(shù)為0,即認為該變量不是因變量的影響因素t統(tǒng)計量大于理論的t分布值,則拒絕原假設,否則接受原假設;也可以根據(jù)概率值P判斷是否需要拒絕原假設

#返回模型概覽

print(fit.summary())

由圖可知:F-statistic:296.0,Prob(F-statistic):4.53e-30,F(xiàn)統(tǒng)計量值為296.0,對應的概率值P遠遠小于0.05,說明應該拒絕原假設,認為模型是顯著的。

在各自變量的t統(tǒng)計中,Administration和Marketing_Spend變量所對應的概率值p大于0.05,說明不能拒絕原假設,認為該變量是不顯著的,無法認定其實影響Profit的重要因素

對于F檢驗來說,如果無法拒絕原假設,則認為模型是無效的,通常解決辦法是增加數(shù)據(jù)量、改變自變量或選擇其他模型;對于t檢驗,如果無法拒絕原假設,則認為對應的自變量與因變量之間不存在線性關(guān)系,通常的解決辦法是剔除該變量或修正該變量(如選擇對于的數(shù)學轉(zhuǎn)換函數(shù)對其修正處理)

根據(jù)返回的fit模型的概覽信息,由于Administration和Marketing_Spend變量的t檢驗結(jié)果是不顯著的,故可以探索其余因變量Profit之間的散點關(guān)系,如果確實沒有線性關(guān)系,可將其從模型中剔除。

sns.lmplot(x=Administration,y=Profit,data=profit,

legend_out=False,#將圖例呈現(xiàn)在圖框內(nèi)

fit_reg=False#不顯示擬合曲線

sns.lmplot(x=Marketing_Spend,y=Profit,data=profit,

legend_out=False,#將圖例呈現(xiàn)在圖框內(nèi)

fit_reg=False#不顯示擬合曲線

plt.show()

圖中自變量Administration、Marketing_Spend與因變量Profit沒有呈現(xiàn)明顯的線性關(guān)系,故可以認為兩者不存在互相依賴關(guān)系

#將Administration、Marketing_Spend變量從模型中剔除

fit2=sm.formula.ols(Profit~RD_Spend,data=profit).fit()

print(fit2.params)#Intercept:49032.899141,RD_Spend:0.854291

print(fit2.summary())#Prob(F-statistic):3.50e-32;P|t|:0.000

對模型fit重新調(diào)整后,得到的新模型fit2仍然通過了顯著性檢驗,而且每個自變量所對應的系數(shù)也是通過顯著性檢驗的。

最終得到的模為:

Profit=49032.899141+0.854291RD_Spend

該回歸模型中的系數(shù)解釋為:在其他條件不變的情況下RD_Spend每增加一個單位,將使Profit增加0.854291個單位。

3.基于回歸模型識別異常點

回歸模型計算過程會依賴于自變量的均值,均值的最大弊端是其容易受到異常點(或極端值)的影響

建模數(shù)據(jù)中存在異常點,一定程度上會影響到建模的有效性

對于現(xiàn)行回歸模型來說,通常利用帽子矩陣、DFFITS準則、學生化殘差或Cook距離進行異常點檢測

使用以上4中方法判別數(shù)據(jù)集的第i個樣本是否為異常點,前提是已構(gòu)建好一個線性回歸模型,然后基于由get_influence方法獲得4種統(tǒng)計量的值

繼續(xù)使用上面的數(shù)據(jù)。

#異常值檢驗

outliers=fit2.get_influence()

#高杠桿值點(帽子矩陣)

leverage=outliers.hat_matrix_diag

#diffits值

dffits=outliers.dffits[0]

#學生化殘差

resid_stu=outliers.resid_studentized_external

#cook距離

cook=outliers.cooks_distance[0]

concat_result=pd.concat([pd.Series(leverage,name=leverage),pd.Series(dffits,name=diffits),

pd.Series(resid_stu,name=resid_stu),pd.Series(cook,name=cook)],axis=1)

raw_outliers=pd.concat([profit,concat_result],axis=1)

前5行數(shù)據(jù)集打印結(jié)果如下:

簡單起見,這里使用學生化殘差,當學生化殘差大于2時,即認為對應的數(shù)據(jù)點為異常值

#計算異常值數(shù)量的比例

outliers_ratio=sum(np.where(np.abs(raw_outliers.resid_stu)2,1,0))/raw_outliers.shape[0]

print(outliers_ratio)#0.04

結(jié)果顯示,通過學生化殘差識別出了異常值,并且異常值比例為4%。由于異常值比例非常小,故可以考慮將其直接從數(shù)據(jù)集中刪除,由此繼續(xù)建模將會得到更加穩(wěn)健且合理的模型

#通過篩選的方法,將異常點排除

none_outliers=raw_outliers.loc[np.abs(raw_outliers.resid_stu)=2,]

#應用無異常值的數(shù)據(jù)集重新建模

fit3=sm.formula.ols(Profit~RD_Spend,data=profit).fit()

#返回模型的概覽信息

print(fit3.params)#Intercept:49032.899141,RD_Spend:0.854291

print(fit3.summary())

排除異常點之后得到的模型fit3,不管是模型的顯著性檢驗還是系數(shù)的顯著性檢驗,各自的概率P值均小于0.05,說明他們均通過顯著性檢驗。

模型fit3為:Profit=49032.899141+0.854291RD_Spend

從fit3模型來看RD_Spend(研發(fā)成本)每增加一個單位的成本,所帶來的Profit(收益)提升要明顯比其他的高,所以將更多的成本花費在研發(fā)上是個不錯的選擇。

以原始數(shù)據(jù)profit為例,根據(jù)fit3模型重新預測各成本下的收益預測值:

pred=fit3.predict(profit[[RD_Spend]])

#對于實際值與預測值的比較

df=pd.concat([pd.Series(profit.Profit/100,name=real),pd.Series(pred/100,name=prediction)],axis=1)

df[誤差絕對值]=np.abs((df[real]-df[prediction])/100)

print(df.head(10))

從結(jié)果上看有的預測值比較接近實際值,有的預測測偏離實際值較遠,但從總體上來說,預測值與實際值之間的差異并不是特別大。

4.含有離散變量的回歸模型

虛擬變量也稱為啞變量,專門用來解決離散型變量無法量化的問題

解決思路為:根據(jù)離散變量的值,衍生出多個0-1值的新變量如:0表示不屬于當前狀態(tài),1表示屬于當前狀態(tài)

假設有未婚、已婚、離婚三個啞變量,違背了數(shù)據(jù)的非多重共線性假設(即啞變量之間存在非常高的相關(guān)性),非已婚非離婚為未婚狀態(tài),所以在構(gòu)建啞變量處理離散型自變量時,啞變量的個數(shù)應該為n-1,其中n表示離散型自變量的不同值個數(shù)

對于線性回歸模型來說,從所有啞變量中刪除某個啞變量時,被刪除的啞變量便成為參照變量(因為可以將參照變量用于對比其他變量對因變量的影響)

以經(jīng)典的泰坦尼克號數(shù)據(jù)為例:

titanic=pd.read_csv(Titanic_all.csv,sep=,)

print(titanic.dtypes)

12個變量中涉及5個離散型變量和7個數(shù)值型變量。根據(jù)知己情況可知,船艙等級Pclass應為離散型變量(3等、2等、1等,并非數(shù)值)

查看各變量的缺失比例

print(titanic.isnull().sum(axis=0)/titanic.shape[0])

Cabin缺失比例超過77%,Embarked缺失比例僅為0.22%,二者數(shù)據(jù)刪除。

在這里我們需要利用年齡的非缺失數(shù)據(jù)構(gòu)造多元線性回歸模型,進而預測缺失比例為19.87%的乘客年齡

如需基于其余變量來預測年齡變量Age,至少有5個變量與年齡無關(guān)(乘客編號、姓名、票號信息、座位號信息和登船地點),刪除。

1.刪除無意義的變量

titanic.drop(labels=[PassengerId,Name,Ticket,Cabin,Embarked],axis=1,inplace=True)

2.啞變量轉(zhuǎn)換

titanic.P>

3.將數(shù)據(jù)拆分為兩部分

在清洗后的數(shù)據(jù)集titanic_new中,僅有Age變量存在缺失值

為預測該變量的缺失值,需要將數(shù)據(jù)集按照年齡是否缺失拆分為兩個數(shù)據(jù)子集,分別用于線性回歸模型的構(gòu)造和基于構(gòu)造好的數(shù)據(jù)集對其進行預測

missing=titanic_new.loc[titanic.Age.isnull(),]

no_missing=titanic_new.loc[~titanic.Age.isnull(),]

4.構(gòu)建多元線性回歸模型

#提取出所有的自變量名稱

predictors=no_missing.columns[~no_missing.columns.isin([Age])]

#構(gòu)造多元線性回歸模型的類

lm_>

根據(jù)F檢驗的結(jié)果可知模型是顯著的,但是從t檢驗的結(jié)果來看,僅有船艙等級Pclass和性別Sex是通過顯著性檢驗的。

繪制其他變量與年齡之間的散點圖

sns.pairplot(no_missing[[Survived,SibSp,Parch,Fare,Ag

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論