多重共线性概念
共线性问题指的是输入的自变量之间存在较高的线性相关度。共线性问题会导致回归模型的稳定性和准确性大大降低,另外,过多无关的维度计算也很浪费时间。
多重共线性产生原因
-
样本量太少,导致部分数据以外的呈现线性关系
-
由于某些原因,导致多个变量的变化趋势一致
-
各变量之间存在线性关系,或关联性较强
共线性检验
1. 方差膨胀系数(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]
2. 容忍度(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)
3. 特征值(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)
4. 相关系数
如果相关系数R>0.8时就可能存在较强相关性
import pandas as pd
import numpy as np
x = pd.DataFrame(np.random.rand(100, 8))
print(x.corr())
共线性数据处理
-
增大样本量:增大样本量可以消除由数据量不足而出现的偶然的共线性现象。
-
做差分:对于时间序列来讲一阶差分可以有效地消除多重共线性。
-
岭回归法(Ridge Regression):通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价来获得更实际和可靠性更强的回归系数。
-
逐步回归法(Stepwise Regression):每次引入一个自变量进行统计检验,然后逐步引入其他变量,同时对所有变量的回归系数进行检验,如果原来引入的变量由于后面变量的引入而变得不再显著,那么久将其剔除,逐步得到最有回归方程。
-
主成分回归(Principal Components Regression):通过主成分分析,使用PCA降维后再建模。
-
对于高共线性且价值不大的数据直接删除即可。