使用 VIF(方差膨胀因子) 检测多重共线性#

之前在研究《预测SP500指数走势》就发现了原文作者使用了VIF的方法来检测自变量之间是否存在多重共线性的问题。

多重共线性

当多元回归模型中存在两个或多个自变量并且它们之间具有高度相关性时,就会发生多重共线性。

当某些特征高度相关时,我们可能难以区分它们对因变量的影响。 因此,我们可以使用各种技术检测多重共线性,其中一种技术是方差膨胀因子(VIF)

在VIF方法中,我们选择每个特征并将其与所有其他特征进行回归。 对于每个回归,因子的计算公式为:

VIF

Fig. 29 Source: geeksforgeeks.org#

其中,R平方是线性回归中的决定系数。其值介于 0 和 1 之间。

正如我们从公式中看到的,R平方的值越大,VIF就越大。因此,VIF越大,表示相关性越高。 这与以下事实一致,即 R的平方值越高表示共线性越强通常,VIF 高于 5 表示高多重共线性

Tip

但在实践过程中,我一般认为 VIF 高于 10 才表示高多重共线性。

Python#

Python中的 statsmodels 库提供了一个名为 variance_inflation_factor() 的函数来计算 VIF。

下面为 geeksforgeeks 提供的例子:

数据集#

data的数据集:

Gender  Height  Weight  Index
0    Male     174      96      4
1    Male     189      87      2
2  Female     185     110      4
3  Female     195     104      3
4    Male     149      61      3

方法#

  • 每个特征索引都传递给variance_inflation_factor() 以查找相应的 VIF

  • 数据的形式为Pandas DataFrame

代码#

from statsmodels.stats.outliers_influence import variance_inflation_factor

# creating dummies for gender
data['Gender'] = data['Gender'].map({'Male':0, 'Female':1})

# the independent variables set
X = data[['Gender', 'Height', 'Weight']]

# VIF dataframe
vif_data = pd.DataFrame()
vif_data["feature"] = X.columns

# calculating VIF for each feature
vif_data["VIF"] = [variance_inflation_factor(X.values, i)
						for i in range(len(X.columns))]

print(vif_data)

输出#

feature        VIF
0  Gender   2.028864
1  Height  11.623103
2  Weight  10.688377

身高(Height) 和 体重(Weight) 具有非常高的VIF值,表明这两个变量高度相关。这是意料之中的,因为一个人的身高确实会影响他们的体重。因此,将这两个特征放在一起考虑,可以得到一个具有高多重共线性的模型。

参考#