本文出處:https://www.pythonheidong.com/blog/article/891810/fca72fefb44eebb191e8/
1.多重共線性概念
共線性問題指的是輸入的自變量之間存在較高的線性相關度。共線性問題會導致回歸模型的穩定性和准確性大大降低,另外,過多無關的維度計算也很浪費時間。
2.多重共線性產生原因
樣本量太少,導致部分數據以外的呈現線性關系
由於某些原因,導致多個變量的變化趨勢一致
各變量之間存在線性關系,或關聯性較強
3.共線性檢驗
- 方差膨脹系數(variance inflation factor,VIF)
VIF是容忍度的倒數,值越大則共線性問題越明顯,通常以10作為判斷邊界。當VIF<10,不存在多重共線性;當10<=VIF<100,存在較強的多重共線性;當VIF>=100, 存在嚴重多重共線性。
import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor
import numpy as np
x = pd.DataFrame(np.random.rand(100, 8))
# 當VIF<10,說明不存在多重共線性;當10<=VIF<100,存在較強的多重共線性,當VIF>=100,存在嚴重多重共線性
vif = [variance_inflation_factor(x.values, x.columns.get_loc(i)) for i in x.columns]
- 容忍度(Tolerance)
容忍度是每個自變量作為因變量對其他自變量進行回歸建模時得到的殘差比例,大小用1減得到的決定系數來表示。容忍度值越小說明這個自變量與其他自變量間越可能存在共線性問題。
import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor
import numpy as np
x = pd.DataFrame(np.random.rand(100, 8))
# 當VIF<10,說明不存在多重共線性;當10<=VIF<100,存在較強的多重共線性,當VIF>=100,存在嚴重多重共線性
tol = [1./variance_inflation_factor(x.values, x.columns.get_loc(i)) for i in x.columns]
print(tol)
- 特征值(Eigenvalue)
該方法實際上就是對自變量做主成分分析,如果多個維度的特征值等於0,則可能有比較嚴重的共線性。
import pandas as pd
import numpy as np
x = pd.DataFrame(np.random.rand(8, 8)) # 計算特征必須為矩陣才行,也可以對缺失的地方補0
eigenvalue, featurevector = np.linalg.eig(x)
- 相關系數
如果相關系數R>0.8時就可能存在較強相關性
import pandas as pd
import numpy as np
x = pd.DataFrame(np.random.rand(100, 8))
print(x.corr())
4.共線性數據處理
-
增大樣本量:增大樣本量可以消除由數據量不足而出現的偶然的共線性現象。
-
做差分:對於時間序列來講一階差分可以有效地消除多重共線性。
-
嶺回歸法(Ridge Regression):通過放棄最小二乘法的無偏性,以損失部分信息、降低精度為代價來獲得更實際和可靠性更強的回歸系數。
-
逐步回歸法(Stepwise Regression):每次引入一個自變量進行統計檢驗,然后逐步引入其他變量,同時對所有變量的回歸系數進行檢驗,如果原來引入的變量由於后面變量的引入而變得不再顯著,那么久將其剔除,逐步得到最有回歸方程。
-
主成分回歸(Principal Components Regression): 通過主成分分析,使用PCA降維后再建模。
對於高共線性且價值不大的數據直接刪除即可。