检测高度相关的属性
Posted
技术标签:
【中文标题】检测高度相关的属性【英文标题】:Detecting highly correlated attributes 【发布时间】:2016-02-07 16:13:51 【问题描述】:在使用多元线性回归时,scikit-learn 能否用于去除高度相关的特征?
关于@behzad.nouri 对Capturing high multi-collinearity in statsmodels 的回答,我有一些问题可以避免我的困惑。
因此,他测试了5列或自变量特征之间的高度多重共线性;每列有 100 行或数据。他知道 w[0] 接近于零。那么我可以说应该删除第一列或第一个自变量以避免非常高的多重共线性吗?
【问题讨论】:
请将您的问题标题编辑为有用的内容。有人怎么可能通过搜索标题找到它。这似乎也不是一个编程问题。这似乎是一个统计问题,在其他地方可能会更好。 【参考方案1】:为了检测多重共线性的原因,您可以简单地检查相关矩阵(behzad.nouri 答案中的前两行)以查看哪些变量彼此高度相关(寻找接近 1 的值)。
另一种方法是查看方差膨胀因子 (VIF)。 statsmodels 包也报告 VIF 值。没有标准阈值,但大于 4 的 VIF 值被认为是有问题的。
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])
在上面的代码中,我创建了三个随机变量x
、y
和z
。 x
和 y
之间的协方差很高,所以如果你打印出相关矩阵,你会发现这两个变量之间的相关性也很高(0.931)。
array([[ 1. , 0.93109838, 0.1051695 ],
[ 0.93109838, 1. , 0.18838079],
[ 0.1051695 , 0.18838079, 1. ]])
在此阶段,您可以丢弃x
或y
,因为它们之间的相关性非常高,仅使用其中一个就足以解释大部分变化。
您也可以检查 VIF 值:
exog = np.array([x,y,z]).transpose()
vif0 = oi.variance_inflation_factor(exog, 0)
如果您打印出vif0
,它将为您提供第一个变量的 7.21,这是一个很大的数字,表明第一个变量与其他变量的多重共线性很高。
从分析中排除哪一个(x
或 y
)取决于您。您可以检查他们的标准化回归系数,看看哪个影响更大。如果您有多重共线性问题,您还可以使用岭回归或套索等技术。如果你想更深入,我建议你问CrossValidated。
【讨论】:
好的。那么您能否向我展示一个使用相关矩阵或 VIF 方法提取导致多重共线性的变量的代码示例? 好的,点赞!所以 vif0 是第一个变量? oi.variance_inflation_factor(exog, 1) 给出第二个变量? 很好!对于 corrcoef,我如何区分变量 1 和 2 之间的系数? 最后一个问题,你能帮我在没有 patsy 和 panda 的情况下做吗,df = pd.DataFrame([x,y,z]).T; exog = dmatrix(df) 我的意思是只为df = pd.DataFrame([x,y,z]).T; exog = dmatrix(df)
以上是关于检测高度相关的属性的主要内容,如果未能解决你的问题,请参考以下文章