【機器學習筆記】:大話線性迴歸(三)

本篇介紹線性迴歸診斷的餘下部分:

  • 多重共線性分析
  • 強影響點分析

▌多重共線性檢驗

1. 多重共線性產生的問題

當迴歸模型中兩個或兩個以上的自變量彼此相關時,則稱迴歸模型中存在多重共線性,也就是說共線性的自變量提供了重複的信息。

那麼這種多重共線性會有什麼不好的影響嗎?答案是會的,而且影響非常不好。總結一下就是:會造成迴歸係數,截距係數的估計非常不穩定,即整個模型是不穩定。這種不穩定的具體表現是:很可能迴歸係數原來正,但因爲共線性而變爲負。這對於一些自變量的可解釋性來講可能是致命的,因爲得到錯誤係數無法解釋正常發生的現象。

那究竟爲什麼多重共線性會導致迴歸係數,以及模型不穩定呢?舉個簡單的例子說明下:比如我有一個二元線性迴歸模型,自變量是x1和x2,如果我們畫圖大家可以很自然的想象出一個三維(三軸)座標系。假如x1和x2之間沒有多重共線性,那麼這個模型就是一個確定了的超平面。但假如x1和x2有很強的多重共線性,那麼這個模型就近似是一個直線向量,而以這個直線所擬合出來的平面是無數個的(穿過一條直線的平面是不固定的)。這也就造成了迴歸係數的不確定性,以及模型無法穩定。

2. 多重共線性的檢測

多重共線性有很多檢測方法,最簡單直接的就是計算各自變量之間的相關係數,並進行顯著性檢驗。具體的,如果出現以下情況,可能存在多重共線性:

(1)模型中各對自變量之間顯著性相關。

(2)當模型線性關係(F檢驗)顯著時,幾乎所有迴歸係數的t檢驗不顯著。

(3)迴歸係數的正負號與預期的相反。

(4)方差膨脹因子(VIF)檢測,一般認爲VIF大於10,則存在嚴重的多重共線性。

這裏主要說明一下(1)和(4),因爲(2)和(3)一般通過觀察即可。

相關係數檢驗

相關係數的公式如下,協方差除以各自變量的方差。

由於提供數據集變量不適合相關係數舉例,因此爲了說明Python中如何使用,採取了隨機數的方法。主要是用到了DataFrame的corr()方法,默認皮爾遜相關,然後通過seaborn的heatmap可以可視化展示出來。以下是代碼部分:

import seaborn as sns
import numpy as np
import pandas as pd
a = np.random.rand(4,3)
print(pd.DataFrame(np.round(a,2), columns = ['a', 'b', 'c'], index = range(1,5)).corr())
fig, ax = plt.subplots(figsize = (10,10))
sns.heatmap(pd.DataFrame(np.round(a,2),
            columns = ['a', 'b', 'c'],
            index = range(1,5)),
            cmap="YlGnBu")
sns.pairplot(pd.DataFrame(np.round(a,2)))
plt.show()

可以看到:a和b(正相關)相關係數爲0.846,有很強的相關係數,存在多重共線性。

方差膨脹因子經驗

另一種計算的方法就是通過方差膨脹因子判斷。方差膨脹因子的公式如下:

VIF的公式是基於擬合優度R2的,其中VIF代表自變量X的方差膨脹係數,R代表把自變量X最爲因變量,與其他自變量做迴歸時的R2。關於R2介紹可以參考【機器學習筆記】:大話線性迴歸(二)。具體的代碼部分如下:

# 自定義VIF方差膨脹因子計算
import statsmodels.formula.api as smf

def vif(df, col_i):
    cols = list(df.columns)
    cols.remove(col_i)
    cols_noti = cols
    formula = col_i + '~' + '+'.join(cols_noti)
    r2 = smf.ols(formula, df).fit().rsquared
    return 1./(1.-r2)

for i in df.columns:
    print(i, '\t', vif(df,col_i=i))

如果自變量X與其他自變量共線性強,那麼迴歸方程的R2就會較高,導致VIF也高。一般,有自變量VIF值大於10,則說明存在嚴重多重共線性,可以選擇刪除該變量或者用其他類似但VIF低的變量代替。

3. 多重共線性的處理方法

多重共線性對於線性迴歸是種災難,並且我們不可能完全消除,而只能利用一些方法來減輕它的影響。對於多重共線性的處理方式,有以下幾種思路:

(1)提前篩選變量:可以利用相關檢驗來或變量聚類的方法。注意:決策樹和隨機森林也可以作爲提前篩選變量的方法,但是它們對於多重共線性幫助不大,因爲如果按照特徵重要性排序,共線性的變量很可能都排在前面。

(2)子集選擇:包括逐步迴歸和最優子集法。因爲該方法是貪婪算法,理論上大部分情況有效,實際中需要結合第一種方法。

(3)收縮方法:正則化方法,包括嶺迴歸和LASSO迴歸。LASSO迴歸可以實現篩選變量的功能。

(4)維數縮減:包括主成分迴歸(PCR)和偏最小二乘迴歸(PLS)方法。

由於篇幅原因,關於這些處理方法,後續會慢慢介紹。

▌強影響點分析

強影響點指的就是離散點。這個很容易聯想到,如果有一些離散點遠離大部分數據,那麼擬合出來的模型可能就會偏離正常軌跡,受到影響。因此,在做線性迴歸診斷分析的時候也必須把這些強影響點考慮進去,進行分析。針對於強影響點分析,一般的有以下幾種方法:

(1)學生化殘差

(2)Cook's D統計量

(3)DFFITS統計量

(4)DFBETAS統計量

1. 學生化殘差(SR)

學生化殘差(SR)指殘差標準化後的數值。一般的當樣本量爲幾百時,學生化殘差大於2的點被視爲強影響點,而當樣本量爲上千時,學生化殘差中大於3的點爲相對大的影響點。

2. Cook's D統計量

Cook‘s D統計量用於測量當第i個觀測值從分析中去除時,參數估計的改變程度。一般的Cook's D值越大說明越可能是離散點,沒有很明確的臨界值。建議的影響臨界點是:Cook's D > 4/n,即高於此值可被視爲強影響點。

3. DFFITS統計量

用於測量第i個觀測值對預測值的影響。建議的臨界值爲:

4. DFBETAS統計量

用於測量當去除第i個觀測量時,第j個參數估計的變化程度。建議的影響臨界值爲:

對於這些指標我們可以通過statsmodels直接查找到,對於我們建立的模型model自動檢測每個樣本的指標值是多少,我們只需要設置相應的臨界點來判斷就可以完成檢測了。以下是代碼實現部分:

# 強離散點各個指標
from statsmodels.stats.outliers_influence import OLSInfluence
import statsmodels.api as sm

model = sm.OLS(yArr,xArr).fit()
OLSInfluence(model).summary_frame().head()

當然,如果我們想單獨獲取某個指標,我們也可以這樣操作:

# 單獨獲取各個指標
ol = model.get_influence()

leverage = ol.hat_diag_factor
dffits = ol.dffits
resid_stu = ol.resid_studentized_external
cook = ol.cooks_distance

▌線性迴歸總結

結合前兩篇文章對整個線性迴歸流程做一個總結,可以參照下方流程來進行理解。

以上就是線性迴歸建模的整個過程,其中還有很多細節沒有涉及到,會在後續進行整理並分享,完整代碼在知識星球中(點擊下方閱讀原文)。

參考: 統計學,賈俊平 計量經濟學導論,伍德里奇 從零開始學Python數據分析與挖掘,劉順祥 Python數據科學技術詳解與商業實踐,常國珍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章