2015-11-06 47 views
0

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

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

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

+0

请编辑您的问题标题为有用的东西。怎么可能有人通过搜索标题来找到它。这似乎也不是一个编程问题。这似乎是一个统计问题,可能会更好地问别的地方。 – talonmies

回答

1

为了检测多重共线性的原因,您可以简单地检查相关矩阵(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

+0

好的。那么你能告诉我一个带有代码的例子,使用相关矩阵或VIFs方法提取导致多重共线性的变量吗? – jean

+0

好的,upvoted!所以vif0是第一个变量? oi.variance_inflation_factor(exog,1)给出第二个变量? – jean

+0

多数民众赞成好!对于corrcoef,我如何分开变量1和2之间的系数? – jean