多重共線性檢驗-方差膨脹系數(VIF)


 

  方差膨脹系數(variance inflation factor,VIF)是衡量多元線性回歸模型中復 (多重)共線性嚴重程度的一種度量。它表示回歸系數估計量的方差與假設自變量間不線性相關時方差相比的比值。

  多重共線性是指自變量之間存在線性相關關系,即一個自變量可以是其他一個或幾個自變量的線性組合。若存在多重共線性,計算自變量的偏回歸系數時矩陣不可逆。其表現主要有:整個模型的方差分析結果與各個自變量的回歸系數的檢驗結果不一致,專業判斷有統計學意義的自變量檢驗結果卻無意義,自變量的系數或符號與實際情況嚴重不符等。
檢驗方法主要有:容忍度(Tolerance)和方差膨脹系數(Variance inflation factor,VIF)。其中最常用的是VIF,計算公式為:
VIF的取值大於1。VIF值越接近於1,多重共線性越輕,反之越重。當多重共線性嚴重時,應采取適當的方法進行調整  [3]  。容忍度的值界於0至1之間,當容忍度值較小時,表示此自變量與其他自變量之間存在共線性。容忍度這個變量回歸系數的估計值不夠穩定,則回歸系數的計算值也會有很大誤差。方差膨脹系數是容忍度的倒數,VIF越大,表示自變量的容忍度越小,越有共線性問題。
  通常以10作為判斷邊界。當VIF<10,不存在多重共線性;當10<=VIF<100,存在較強的多重共線性;當VIF>=100, 存在嚴重多重共線性。

import numpy as np
from sklearn.linear_model import LinearRegression

coef0=np.array([5,6,7,8,9,10,11,12])
X1=np.random.rand(100,8)
y=np.dot(X1,coef0)+np.random.normal(0,1.5,size=100)
training=np.random.choice([True,False],p=[0.8,0.2],size=100)
lr1=LinearRegression()
lr1.fit(X1[training],y[training])
# 系數的均方誤差MSE
print(((lr1.coef_-coef0)**2).sum()/8)
# 測試集准確率(R2)
print(lr1.score(X1[~training],y[~training]))


X2=np.column_stack([X1,np.dot(X1[:,[0,1]],np.array([1,1]))+np.random.normal(0,0.05,size=100)])
X2=np.column_stack([X2,np.dot(X2[:,[1,2,3]],np.array([1,1,1]))+np.random.normal(0,0.05,size=100)])
X3=np.column_stack([X1,np.random.rand(100,2)])

import matplotlib.pyplot as plt
clf=LinearRegression()
vif2=np.zeros((10,1))
for i in range(10):
tmp=[k for k in range(10) if k!=i]
clf.fit(X2[:,tmp],X2[:,i])
vifi=1/(1-clf.score(X2[:,tmp],X2[:,i]))
vif2[i]=vifi

plt.figure()
ax = plt.gca()
ax.plot(vif2)
#ax.plot(vif3)
plt.xlabel('feature')
plt.ylabel('VIF')
plt.title('VIF coefficients of the features')
plt.axis('tight')
plt.show()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM