▌線性迴歸擬合優度api
1. 斷定係數app
迴歸直線與各觀測點的接近程度成爲迴歸直線對數據的擬合優度。而評判直線擬合優度須要一些指標,其中一個就是斷定係數。ide
咱們知道,因變量y值有來自兩個方面的影響:測試
(1)來自x值的影響,也就是咱們預測的主要依據spa
(2)來自沒法預測的干擾項ϵ的影響3d
若是一個迴歸直線預測很是準確,那麼它就須要讓來自x的影響儘量的大,而讓來自沒法預測干擾項的影響儘量的小,也就是說x影響佔比越高,預測效果就越好。下面咱們看一下如何定義這些影響,並造成指標。code
SST(總平方和):變差總平方和
orm
***(迴歸平方和):由x與y之間的線性關係引發的y變化blog
SSE(殘差平方和):除x影響以外的其它因素引發的y變化事件
它們之間的關係是:。根據咱們前面的分析,***越高,則表明迴歸預測越準確,觀測點越是靠近直線,也即
越大,直線擬合越好。所以,斷定係數的定義就天然的引出來了,咱們通常稱爲R2。
仍是用上篇的數據爲例,利用R2來測試一下擬合的效果是怎麼樣的。
def R2square(yArr,y_hat):
n = len(yArr)
yArr = np.array(yArr).reshape(n,1)
y_hat = np.array(y_hat).reshape(n,1)
# ***
diff_yhat = y_predict - np.mean(yArr)
*** = np.sum(np.power(diff_yhat,2))
# sst
diff_y = yArr - np.mean(yArr)
sst = np.sum(np.power(diff_y,2))
return round(***/sst,2)
R2square(yArr,y_predict)
>>0.97
能夠看到最後的得分是0.97,說明擬合程度仍是很不錯的。
估計標準偏差與斷定係數相反,se反映了預測值與真實值之間偏差的大小,se越小說明擬合度越高,相反,se越大說明擬合度越低。仍然用以前的數據集進行測試:
def MSEsqrt(yArr,y_hat):
n = len(yArr)
yArr = np.array(yArr).reshape(n,1)
y_hat = np.array(y_hat).reshape(n,1)
diff = yArr - y_predict
# sse
sse = np.sum(np.power(diff,2))
return round(np.sqrt(sse/(n-2)),2)
MSEsqrt(yArr,y_predict)
>>0.08
能夠看到,平均的標準偏差只有0.08,很是低,說明了擬合效果很不錯,同時也證明了R2結果的正確性。
▌線性迴歸的顯著性檢驗
要想知道咱們根據樣本擬合的模型是否能夠有效地預測或估計,咱們須要對擬合的模型進行顯著性檢驗。迴歸分析中的顯著性檢驗主要包括兩方面內容:線性關係檢驗;迴歸係數檢驗。
1. 線性關係檢驗
線性關係檢驗是指多個自變量x和因變量y之間的線性關係是否顯著,它們之間是否能夠用一個線性模型表示。檢驗統計量使用F分佈,其定義以下:
***的自由度爲:自變量的個數k
SSE的自由度爲:n-k-1
利用F統計量,線性關係檢驗的通常步驟爲:
(1)提出原假設和備擇假設
(2)計算檢驗的統計量F
(2)做出統計決策
與假設檢驗相同,若是給定顯著性水平α,則根據兩個自由度k和n-k-1進行F分佈的查表。若,則拒絕原假設,說明發生了小几率事件,若
,則不拒絕原假設。固然,咱們也能夠直接經過觀察P值來決定是否拒絕原假設。
經過上面步驟的假設,咱們也看到了:在多元線性迴歸中,只要有一個自變量係數不爲零(即至少一個自變量係數與因變量有線性關係),咱們就說這個線性關係是顯著的。若是不顯著,說明全部自變量係數均爲零。
2. 迴歸係數檢驗
迴歸係數的顯著性檢驗與線性檢驗不一樣,它要求對每個自變量係數進行檢驗,而後經過檢驗結果可判斷出自變量是否顯著。所以,咱們能夠經過這種檢驗來判斷一個特徵(自變量)的重要性,並對特徵進行篩選。檢驗統計量使用t分佈,步驟以下:
(1)提出原假設和備擇假設
對於任意參數,有:
(2)計算檢驗統計量t
(3)做出統計決策
如前面同樣,咱們須要根據自由度n-k-1查t分佈表,並經過α或者p值判斷顯著性。
3. Python代碼實現
下面經過一段代碼來講明上面兩種顯著性檢驗,爲了方便咱們直接經過statsmodels模型引入ols模型進行迴歸擬合,而後查看總結表,其中包括F和t統計量結果。
import statsmodels.formula.api as smf
import statsmodels.api as sm
# 建立線性迴歸最小二乘法模型
model = sm.OLS(yArr,xArr)
results = model.fit()
results.summary()
經過上面結果咱們清楚看到:
F統計量的p值很是小,拒絕原假設,說明線性關係顯著
兩個迴歸係數的t統計量p值均爲0,拒絕原假設,說明迴歸係數也都顯著
▌線性迴歸的診斷
線性迴歸的診斷包括不少內容,比較重要的幾個有:
(1)殘差分析
(2)線性相關性檢驗
(3)多重共線性分析
(4)強影響點分析
下面咱們開始分別介紹這幾個須要診斷的內容。
殘差分析
還記得咱們的模型是怎麼來的嗎?沒錯,線性迴歸模型是基於一些假設條件的:除了自變量和因變量有線性相關關係外,其它假設基本都是關於殘差的,主要就是殘差ϵ獨立同分布,服從。
總結一下關於殘差有三點假設:(1)正態性檢驗;(2)獨立性檢驗;(3)方差齊性檢驗。下面咱們將對這些假設逐一診斷,只有假設被驗證,模型纔是成立的。
1. 正態性檢驗
干擾項(即殘差),服從正態分佈的本質是要求因變量服從變量分佈。所以,驗證殘差是否服從正態分佈就等於驗證因變量的正態分佈特性。關於正態分佈的檢驗一般有如下幾種方法。
(1)直方圖法:
直方圖法就是根據數據分佈的直方圖與標準正態分佈對比進行檢驗,主要是經過目測。好比本例中咱們的直方圖能夠這樣顯示出來:
residual = results.resid
sns.distplot(residual,
bins = 10,
kde = False,
color = 'blue',
fit = stats.norm)
plt.show()
經過目測,咱們發現殘差的數據分佈並非很好的服從正態分佈,所以這裏是不知足假設條件的。
(2)PP圖和QQ圖:
PP圖是對比正態分佈的累積機率值和實際分佈的累積機率值。statsmodels中直接提供了該檢測方法:
# pp圖法
pq = sm.ProbPlot(residual)
pq.ppplot(line='45')
QQ圖是經過把測試樣本數據的分位數與已知分佈相比較,從而來檢驗數據的分佈狀況。對應於正態分佈的QQ圖,就是由標準正態分佈的分位數爲橫座標,樣本值爲縱座標的散點圖。一樣的,咱們經過一段代碼來觀察一下:
# qq圖法
pq = sm.ProbPlot(residual)
pq.qqplot(line='q')
pp圖和qq圖判斷標準是:若是觀察點都比較均勻的分佈在直線附近,就能夠說明變量近似的服從正態分佈,不然不服從正態分佈。
從pp圖和qq圖能夠看出,樣本點並非十分均勻地落在直線上,有的地方有一些較大的誤差,所以判斷不是正態分佈。
(3)Shapiro檢驗:
這種檢驗方法均屬於非參數方法,先假設變量是服從正態分佈的,而後對假設進行檢驗。通常地數據量低於5000則可使用Shapiro檢驗,大於5000的數據量可使用K-S檢驗,這種方法在scipy庫中能夠直接調用:
# shapiro檢驗
import scipy.stats as stats
stats.shapiro(residual)
out:
(0.9539670944213867, 4.640808128e-06)
上面結果兩個參數:第一個是Shaprio檢驗統計量值,第二個是相對應的p值。能夠看到,p值很是小,遠遠小於0.05,所以拒絕原假設,說明殘差不服從正態分佈。
一樣的方法還有KS檢驗,也能夠直接經過scipy調用進行計算。
2. 獨立性檢驗
殘差的獨立性能夠經過Durbin-Watson統計量(DW)來檢驗。
原假設:p=0(即先後擾動項不存在相關性)
背責假設:(即近鄰的先後擾動項存在相關性)
DW統計量公式以下:
判斷標準是:
p=0,DW=2:擾動項徹底不相關
p=1,DW=0:擾動項徹底正相關
p=-1,DW=4:擾動項徹底負相關
在咱們前面使用的statsmodels結果表中就包含了DW統計量:
DW值爲2.192,說明殘差之間是不相關的,也即知足獨立性假設。
3. 方差齊性檢驗
若是殘差隨着自變量增發生隨機變化,上下界基本對稱,無明顯自相關,方差爲齊性,咱們就說這是正常的殘差。判斷方差齊性檢驗的方法通常有兩個:圖形法,BP檢驗。
(1)圖形法
圖形法就是畫出自變量與殘差的散點圖,自變量爲橫座標,殘差爲縱座標。下面是殘差圖形的代碼:
# 圖形法
var1 = np.array(xArr)[:,1]
plt.scatter(np.array(xArr)[:,1], residual)
plt.hlines(y = 0,
xmin = np.min(var1),
xmax = np.max(var1),
color = 'red',
linestyles = '--')
plt.xlabel('var0')
plt.ylabel('residual')
plt.show()
圖形法能夠看出:殘差的方差(即觀察點相對紅色虛線的上下浮動大小)不隨着自變量變化有很大的浮動,說明了殘差的方差是齊性的。
若是殘差方差不是齊性的,有不少修正的方法,好比加權最小二乘法,穩健迴歸等,而最簡單的方法就是對變量取天然對數。而取對數從業務上來講也是有意義的,解釋變量和被解釋變量的表達形式不一樣,對迴歸係數的解釋也不一樣。下面是不一樣轉換狀況下的解釋:
對數轉換後的效果能夠經過R2或者修改R2的結果比對得出,若是方差經過取對數變換變成齊性,那麼它的R2應該比變換以前數值高,即會取得更好的效果。
(2)BP檢驗法
這種方法也是一種假設檢驗的方法,其原假設爲:殘差的方差爲一個常數,而後經過計算LM統計量,判斷假設是否成立。在statsmodels中也一樣有相應的方法能夠實現BP檢查方法。
# BP檢驗
sm.stats.diagnostic.het_breuschpagan(residual,results.model.exog)
out:
(0.16586685109032384,
0.6838114989412791,
0.1643444790856123,
0.6856254489662914)
上述參數:
第一個爲:LM統計量值
第二個爲:響應的p值,0.68遠大於顯著性水平0.05,所以接受原假設,即殘差方差是一個常數
第三個爲:F統計量值,用來檢驗殘差平方項與自變量之間是否獨立,若是獨立則代表殘差方差齊性
第四個爲:F統計量對應的p值,也是遠大於0.05的,所以進一步驗證了殘差方差的齊性。
以上就是殘差分析的主要內容,對於線性迴歸診斷還有其他的線性相關性檢驗,多重共線性分析,強影響點分析三部分重要內容,將在下一篇進行介紹,完整代碼在知識星球中。