Python線性回歸圖文實(shí)例詳解
前言:
線性回歸模型屬于經(jīng)典的統(tǒng)計(jì)學(xué)模型,該模型的應(yīng)用場景是根據(jù)已知的變量(即自變量)來預(yù)測某個(gè)連續(xù)的數(shù)值變量(即因變量)。例如餐廳根據(jù)媒體的營業(yè)數(shù)據(jù)(包括菜譜價(jià)格、就餐人數(shù)、預(yù)訂人數(shù)、特價(jià)菜折扣等)預(yù)測就餐規(guī)?;驙I業(yè)額;網(wǎng)站根據(jù)訪問的歷史數(shù)據(jù)(包括新用戶的注冊量、老用戶的活躍度、網(wǎng)站內(nèi)容的更新頻率等)預(yù)測用戶的支付轉(zhuǎn)化率;醫(yī)院根據(jù)患者的病歷數(shù)據(jù)(如體檢指標(biāo)、藥物復(fù)用情況、平時(shí)的飲食習(xí)慣等)預(yù)測某種疾病發(fā)生的概率。
理解什么是線性回歸
線性回歸也被稱為最小二乘法回歸(Linear Regression, also called Ordinary Least-Squares (OLS) Regression)。它的數(shù)學(xué)模型是這樣的:
y = a+ b* x+e
其中,a 被稱為常數(shù)項(xiàng)或截距;b 被稱為模型的回歸系數(shù)或斜率;e 為誤差項(xiàng)。a 和 b 是模型的參數(shù)。
當(dāng)然,模型的參數(shù)只能從樣本數(shù)據(jù)中估計(jì)出來:
y'= a' + b'* x
我們的目標(biāo)是選擇合適的參數(shù),讓這一線性模型最好地?cái)M合觀測值。擬合程度越高,模型越好。
由于針對具體操作相關(guān)文檔太多,所以本文內(nèi)容涉及具體操作較少,主要是講方法。
本文內(nèi)所用到的包:
import pandas as pd import matplotlib.pyplot as plt import numpy as np import seaborn as sns import scipy.stats as stats import statsmodels.api as sm from scipy.stats import chi2_contingency
1.簡單線性回歸模型
- 也被稱為一元線性回歸模型,是指模型中只含有一個(gè)自變量和一個(gè)因變量
- 一般可以通過散點(diǎn)圖刻畫兩個(gè)變量之間的關(guān)系,并基于散點(diǎn)圖繪制簡單線性擬合線,進(jì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í)際的數(shù)據(jù)范圍,對擬合線做截?cái)嗖僮? ) plt.show()
從散點(diǎn)圖來看,自變量speed與因變量dist之間存在明顯的正相關(guān),即剎車速度越大,剎車距離越長。圖內(nèi)的陰影部分為擬合線95%的置信區(qū)間,每個(gè)散點(diǎn)都是盡可能地圍繞在擬合線附近。
通過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
也就是說,剎車速度每提升一個(gè)單位,將促使剎車距離增加3.93個(gè)單位。
2.多元線性回歸模型
實(shí)際應(yīng)用中,簡單線性回歸模型并不多見,因?yàn)橛绊懸蜃兞康淖宰兞客恢挂粋€(gè)用于構(gòu)建多元線性回歸模型的數(shù)據(jù)實(shí)際上由兩部分組成:一個(gè)是一維的因變量y;另一個(gè)是二維矩陣的自變量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
但是,在實(shí)際應(yīng)用中,單純的利用ols函數(shù)將偏回歸系數(shù)計(jì)算出來,并構(gòu)造一個(gè)多元線性回歸模型,得到的結(jié)果往往不是理想的,這時(shí)候需要借助于統(tǒng)計(jì)學(xué)中的F檢驗(yàn)法和t檢驗(yàn)法,完成模型的顯著性檢驗(yàn)和回歸系數(shù)的顯著性檢驗(yàn)。
2.1 應(yīng)用F檢驗(yàn)法完成模型的顯著性檢驗(yàn)
步驟如下:
- 提出問題的原假設(shè)和備擇假設(shè);
- 在原假設(shè)的條件下,構(gòu)造統(tǒng)計(jì)量F;
- 根據(jù)樣本信息,計(jì)算統(tǒng)計(jì)量F的值;
- 對比統(tǒng)計(jì)量的值和理論值,如果計(jì)算的統(tǒng)計(jì)量值超過理論的值,則拒絕原假設(shè),否則需要接受原假設(shè)
假設(shè)認(rèn)為模型的所有偏回歸系數(shù)全為0(即認(rèn)為沒有一個(gè)自變量可以構(gòu)成因變量的線性組合)
通常在實(shí)際的應(yīng)用中將概率值p與0.05做比較,小于0.05則拒絕原假設(shè),否則接受原假設(shè)
2.2應(yīng)用t檢驗(yàn)法完成回歸系數(shù)的顯著性檢驗(yàn)
模型通過了顯著性檢驗(yàn),只能說明模型關(guān)于因變量的線性組合是合理的,但不能說明每個(gè)自變量對因變量都具有顯著意義,所以還要對模型的回歸系數(shù)做顯著性檢驗(yàn)。
只有當(dāng)回歸系數(shù)通過了t檢驗(yàn),才可以認(rèn)為模型的系數(shù)是顯著的t檢驗(yàn)的出發(fā)點(diǎn)就是驗(yàn)證每一個(gè)自變量是否能夠成為影響因變量的重要因素t檢驗(yàn)的原假設(shè)是假定第j變量的回歸系數(shù)為0,即認(rèn)為該變量不是因變量的影響因素t統(tǒng)計(jì)量大于理論的t分布值,則拒絕原假設(shè),否則接受原假設(shè);也可以根據(jù)概率值P判斷是否需要拒絕原假設(shè)
#返回模型概覽 print(fit.summary())
由圖可知:F-statistic:296.0,Prob (F-statistic):4.53e-30,F(xiàn)統(tǒng)計(jì)量值為296.0,對應(yīng)的概率值P遠(yuǎn)遠(yuǎn)小于0.05,說明應(yīng)該拒絕原假設(shè),認(rèn)為模型是顯著的。
在各自變量的t統(tǒng)計(jì)中,Administration和Marketing_Spend變量所對應(yīng)的概率值p大于0.05,說明不能拒絕原假設(shè),認(rèn)為該變量是不顯著的,無法認(rèn)定其實(shí)影響Profit的重要因素
對于F檢驗(yàn)來說,如果無法拒絕原假設(shè),則認(rèn)為模型是無效的,通常解決辦法是增加數(shù)據(jù)量、改變自變量或選擇其他模型;對于t檢驗(yàn),如果無法拒絕原假設(shè),則認(rèn)為對應(yīng)的自變量與因變量之間不存在線性關(guān)系,通常的解決辦法是剔除該變量或修正該變量(如選擇對于的數(shù)學(xué)轉(zhuǎn)換函數(shù)對其修正處理)
根據(jù)返回的fit模型的概覽信息,由于Administration和Marketing_Spend變量的t檢驗(yàn)結(jié)果是不顯著的,故可以探索其余因變量Profit之間的散點(diǎn)關(guān)系,如果確實(shí)沒有線性關(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)系,故可以認(rè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仍然通過了顯著性檢驗(yàn),而且每個(gè)自變量所對應(yīng)的系數(shù)也是通過顯著性檢驗(yàn)的。
最終得到的模為:
Profit=49032.899141+0.854291RD_Spend
該回歸模型中的系數(shù)解釋為:在其他條件不變的情況下RD_Spend每增加一個(gè)單位,將使Profit增加0.854291個(gè)單位。
3.基于回歸模型識(shí)別異常點(diǎn)
- 回歸模型計(jì)算過程會(huì)依賴于自變量的均值,均值的最大弊端是其容易受到異常點(diǎn)(或極端值)的影響
- 建模數(shù)據(jù)中存在異常點(diǎn),一定程度上會(huì)影響到建模的有效性
- 對于現(xiàn)行回歸模型來說,通常利用帽子矩陣、DFFITS準(zhǔn)則、學(xué)生化殘差或Cook距離進(jìn)行異常點(diǎn)檢測
- 使用以上4中方法判別數(shù)據(jù)集的第i個(gè)樣本是否為異常點(diǎn),前提是已構(gòu)建好一個(gè)線性回歸模型,然后基于由get_influence方法獲得4種統(tǒng)計(jì)量的值
繼續(xù)使用上面的數(shù)據(jù)。
#異常值檢驗(yàn) outliers=fit2.get_influence() #高杠桿值點(diǎn)(帽子矩陣) leverage=outliers.hat_matrix_diag #diffits值 dffits=outliers.dffits[0] #學(xué)生化殘差 resid_stu=outliers.resid_studentized_external #cook距離 cook=outliers.cooks_distance[0]
#合并以上4種異常值檢驗(yàn)的統(tǒng)計(jì)量值
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)
#將上面的concat_result結(jié)果與profit數(shù)據(jù)集合并
raw_outliers=pd.concat([profit,concat_result],axis=1)
前5行數(shù)據(jù)集打印結(jié)果如下:
簡單起見,這里使用學(xué)生化殘差,當(dāng)學(xué)生化殘差大于2時(shí),即認(rèn)為對應(yīng)的數(shù)據(jù)點(diǎn)為異常值
#計(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é)果顯示,通過學(xué)生化殘差識(shí)別出了異常值,并且異常值比例為4%。由于異常值比例非常小,故可以考慮將其直接從數(shù)據(jù)集中刪除,由此繼續(xù)建模將會(huì)得到更加穩(wěn)健且合理的模型
#通過篩選的方法,將異常點(diǎn)排除 none_outliers=raw_outliers.loc[np.abs(raw_outliers.resid_stu)<=2,] #應(yīng)用無異常值的數(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())
排除異常點(diǎn)之后得到的模型fit3,不管是模型的顯著性檢驗(yàn)還是系數(shù)的顯著性檢驗(yàn),各自的概率P值均小于0.05,說明他們均通過顯著性檢驗(yàn)。
模型fit3為:Profit=49032.899141+0.854291RD_Spend
從fit3模型來看RD_Spend(研發(fā)成本)每增加一個(gè)單位的成本,所帶來的Profit(收益)提升要明顯比其他的高,所以將更多的成本花費(fèi)在研發(fā)上是個(gè)不錯(cuò)的選擇。
以原始數(shù)據(jù)profit為例,根據(jù)fit3模型重新預(yù)測各成本下的收益預(yù)測值:
pred=fit3.predict(profit[['RD_Spend']]) #對于實(shí)際值與預(yù)測值的比較 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é)果上看有的預(yù)測值比較接近實(shí)際值,有的預(yù)測測偏離實(shí)際值較遠(yuǎn),但從總體上來說,預(yù)測值與實(shí)際值之間的差異并不是特別大。
4.含有離散變量的回歸模型
- 虛擬變量也稱為啞變量,專門用來解決離散型變量無法量化的問題
- 解決思路為:根據(jù)離散變量的值,衍生出多個(gè)"0-1"值的新變量 如:0表示不屬于當(dāng)前狀態(tài),1表示屬于當(dāng)前狀態(tài)
- 假設(shè)有未婚、已婚、離婚三個(gè)啞變量,違背了數(shù)據(jù)的非多重共線性假設(shè)(即啞變量之間存在非常高的相關(guān)性),非已婚非離婚為未婚狀態(tài),所以在構(gòu)建啞變量處理離散型自變量時(shí),啞變量的個(gè)數(shù)應(yīng)該為n-1,其中n表示離散型自變量的不同值個(gè)數(shù)
- 對于線性回歸模型來說,從所有啞變量中刪除某個(gè)啞變量時(shí),被刪除的啞變量便成為參照變量(因?yàn)榭梢詫⒄兆兞坑糜趯Ρ绕渌兞繉σ蜃兞康挠绊懀?/li>
以經(jīng)典的泰坦尼克號(hào)數(shù)據(jù)為例:
titanic=pd.read_csv('Titanic_all.csv',sep=",") print(titanic.dtypes)
12個(gè)變量中涉及5個(gè)離散型變量和7個(gè)數(shù)值型變量。根據(jù)知己情況可知,船艙等級Pclass應(yīng)為離散型變量(3等、2等、1等,并非數(shù)值)
查看各變量的缺失比例
print(titanic.isnull().sum(axis=0)/titanic.shape[0])
Cabin缺失比例超過77%,Embarked缺失比例僅為0.22%,二者數(shù)據(jù)刪除。
在這里我們需要利用年齡的非缺失數(shù)據(jù)構(gòu)造多元線性回歸模型,進(jìn)而預(yù)測缺失比例為19.87%的乘客年齡
如需基于其余變量來預(yù)測年齡變量Age,至少有5個(gè)變量與年齡無關(guān)(乘客編號(hào)、姓名、票號(hào)信息、座位號(hào)信息和登船地點(diǎn)),刪除。
1.刪除無意義的變量
titanic.drop(labels=['PassengerId','Name','Ticket','Cabin','Embarked'],axis=1,inplace=True)
2.啞變量轉(zhuǎn)換
titanic.Pclass=titanic.Pclass.astype(str)#Pclass變量轉(zhuǎn)換為字符型變量 #將Pclass和Sex變量作啞變量處理 dummies=pd.get_dummies(data=titanic[['Pclass','Sex']]) #將titanic數(shù)據(jù)集與dummies數(shù)據(jù)集進(jìn)行合并 titanic_new=pd.concat([titanic,dummies],axis=1) #根據(jù)啞變量原則,需要從新生成的0和1變量中提出兩個(gè)變量作為參照變量(以性別中的男性為參照變量,以船艙等幾種的Pclass_3作為參照變量) titanic_new.drop(labels=['Pclass','Sex','Pclass_3','Sex_male'],axis=1,inplace=True)
3.將數(shù)據(jù)拆分為兩部分
- 在清洗后的數(shù)據(jù)集titanic_new中,僅有Age變量存在缺失值
- 為預(yù)測該變量的缺失值,需要將數(shù)據(jù)集按照年齡是否缺失拆分為兩個(gè)數(shù)據(jù)子集,分別用于線性回歸模型的構(gòu)造和基于構(gòu)造好的數(shù)據(jù)集對其進(jìn)行預(yù)測
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_Class=sm.OLS(endog=no_missing.Age,#指定模型中的因變量 exog=no_missing[predictors]#指定模型中的自變量 ) #基于"類",對模型進(jìn)行擬合 lm_model=lm_Class.fit() print(lm_model.summary())
根據(jù)F檢驗(yàn)的結(jié)果可知模型是顯著的,但是從t檢驗(yàn)的結(jié)果來看,僅有船艙等級Pclass和性別Sex是通過顯著性檢驗(yàn)的。
繪制其他變量與年齡之間的散點(diǎn)圖
sns.pairplot(no_missing[['Survived','SibSp','Parch','Fare','Age']])
唯有SibSp與Age之間存在一定趨勢性,將出SibSp之外其他變量從模型中剔除。
基于散點(diǎn)圖結(jié)果重新構(gòu)造多元線性回歸模型
predictors2=['SibSp','Pclass_1','Pclass_2','Sex_female'] lm_Class2=sm.OLS(endog=no_missing.Age,#指定模型中的因變量 exog=no_missing[predictors2]#指定模型中的自變量 ) lm_model2=lm_Class2.fit() print(lm_model2.summary())
在新的模型中,F(xiàn)檢驗(yàn)的統(tǒng)計(jì)量和t檢驗(yàn)的統(tǒng)計(jì)量所對應(yīng)的概率P值均小于0.05,說明他們通過了顯著性檢驗(yàn)。
最后再利用可視化的QQ圖,驗(yàn)證模型的殘差是否服從正態(tài)分布的假設(shè)
sns.set(font=getChineseFont(8).get_name()) pp_qq_plot=sm.ProbPlot(lm_model2.resid) pp_qq_plot.qqplot(line='q') plt.title('Q-Q圖') plt.show()
圖形中的散點(diǎn)基本上都圍繞在斜線附近,可以判斷模型lm_model2的殘差服從正態(tài)分布,最終證明了lm_model2模型是合理的。
5.未知年齡的預(yù)測
pred_Age=lm_model2.predict(exog=missing[predictors2]) #將年齡的預(yù)測值替換missing數(shù)據(jù)集中的Age變量 missing.loc[:,'Age']=pred_Age #print(missing.head(5)) #將結(jié)果插補(bǔ)到原始數(shù)據(jù)中
總結(jié)
到此這篇關(guān)于Python線性回歸的文章就介紹到這了,更多相關(guān)Python線性回歸內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python實(shí)現(xiàn)線性回歸算法
- python深度總結(jié)線性回歸
- python機(jī)器學(xué)習(xí)基礎(chǔ)線性回歸與嶺回歸算法詳解
- python實(shí)現(xiàn)線性回歸的示例代碼
- python數(shù)據(jù)分析之線性回歸選擇基金
- python基于numpy的線性回歸
- Python實(shí)現(xiàn)多元線性回歸的梯度下降法
- Python構(gòu)建簡單線性回歸模型
- Python反向傳播實(shí)現(xiàn)線性回歸步驟詳細(xì)講解
- python繪制y關(guān)于x的線性回歸線性方程圖像實(shí)例
- python實(shí)現(xiàn)線性回歸的示例代碼
相關(guān)文章
Python?Pexpect庫自動(dòng)化交互式進(jìn)程控制的expect_list方法解析
Pexpect是一個(gè)Python庫,為自動(dòng)化和交互式進(jìn)程控制提供了豐富的功能,而expect_list方法是其功能強(qiáng)大且靈活的一部分,將詳細(xì)探討如何使用這一方法,并提供多個(gè)示例來說明其應(yīng)用場景和功能2024-01-01pytorch 實(shí)現(xiàn)變分自動(dòng)編碼器的操作
這篇文章主要介紹了pytorch 實(shí)現(xiàn)變分自動(dòng)編碼器的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Matlab讀取excel并利用拉依達(dá)準(zhǔn)則篩選數(shù)據(jù)的全過程
在Excel中錄入好數(shù)據(jù)以后經(jīng)常需要被matlab讀取,具體該如何讀取并進(jìn)行篩選呢?下面這篇文章就來給大家介紹了關(guān)于Matlab讀取excel并利用拉依達(dá)準(zhǔn)則篩選數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2021-08-08python中import reload __import__的區(qū)別詳解
這篇文章主要介紹了python中import reload __import__的區(qū)別詳解,需要的朋友可以參考下2017-10-10Python+Turtle動(dòng)態(tài)繪制一棵樹實(shí)例分享
這篇文章主要介紹了Python+Turtle動(dòng)態(tài)繪制一棵樹實(shí)例分享,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Windows下PyCharm配置Anaconda環(huán)境(超詳細(xì)教程)
這篇文章主要介紹了Windows下PyCharm配置Anaconda環(huán)境,本文給大家分享一篇超詳細(xì)教程,通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07