检测高度相关的属性

时间:2015-11-06 13:35:55

标签: python scipy scikit-learn statsmodels

使用scikit-learn可以在使用多元线性回归时去除高度相关的特征吗?

关于@ behzad.nouri向Capturing high multi-collinearity in statsmodels发布的答案,我有一些问题可以避免我的困惑。

因此,他测试了5列中的高多重共线性或自变量的特征;每列有100行或数据。他得知w [0]接近于零。那么我可以说应该删除第一列或第一个自变量以避免非常高的多重共线性吗?

1 个答案:

答案 0 :(得分:4)

为了检测多重共线性的原因,您可以简单地检查相关矩阵(behzad.nouri的答案中的前两行),以查看哪些变量彼此高度相关(查找接近1的值)。

另一种选择是研究方差膨胀因子(VIF)。 statsmodels包也报告VIF值。没有标准阈值,但VIF值大于4被认为是有问题的。

import numpy as np
import statsmodels.stats.outliers_influence as oi
mean = [0, 0, 0]
cov = [[100, 90, 5], [90, 95, 10], [5, 10, 30]]
x, y, z = np.random.multivariate_normal(mean, cov, 1000).T
print np.corrcoef([x,y,z])

在上面的代码中,我创建了三个随机变量xyzxy之间的协方差很高,因此如果打印出相关矩阵,您会发现这两个变量之间的相关性也非常高(0.931)。

array([[ 1.        ,  0.93109838,  0.1051695 ],
   [ 0.93109838,  1.        ,  0.18838079],
   [ 0.1051695 ,  0.18838079,  1.        ]])

在此阶段,您可以放弃xy,因为它们之间的相关性非常高,仅使用其中一个就足以解释大部分变化。

您也可以检查VIF值:

exog = np.array([x,y,z]).transpose()
vif0 = oi.variance_inflation_factor(exog, 0)

如果打印出vif0,它将为第一个变量提供7.21,这是一个高数字,表示第一个变量与其他变量的高多重共线性。

要从分析中排除哪一个(xy)取决于您。您可以检查其标准化回归系数,以查看哪一个具有更高的影响。如果您有多重共线性问题,也可以使用脊回归或套索等技术。如果你想更深入,我建议改为CrossValidated