📜  使用 VIF 检测多重共线性 - Python

📅  最后修改于: 2022-05-13 01:55:14.547000             🧑  作者: Mango

使用 VIF 检测多重共线性 - Python

当多元回归模型中存在两个或多个自变量时,就会出现多重共线性,这些自变量之间具有很高的相关性。当某些特征高度相关时,我们可能难以区分它们对因变量的个体影响。可以使用各种技术检测多重共线性,其中一种技术是方差膨胀因子( VIF )。

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

VIF=\frac{1}{1-R^2}

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

从公式中可以看出,R-squared 的值越大,VIF 越大。因此,更大的 VIF 表示更大的相关性。这与较高的 R 平方值表示较强的共线性这一事实一致。通常,高于 5 的 VIF 表示高度的多重共线性。

使用 statsmodels 实现 VIF:

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

让我们看一个在此数据集上实现该方法的示例。

数据集:

以下示例中使用的数据集包含 500 人的身高、体重、性别和体重指数。这里的因变量是Index

Python3
import pandas as pd 
  
# the dataset
data = pd.read_csv('BMI.csv')
  
# printing first few rows
print(data.head())


Python3
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)


输出 :

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 的形式存储。

Python3

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

正如我们所看到的,身高和体重的 VIF 值非常高,表明这两个变量高度相关。这是意料之中的,因为一个人的身高确实会影响他们的体重。因此,将这两个特征一起考虑会导致模型具有高度的多重共线性。