在这种情况下如何解释VIF?

时间:2020-02-12 05:20:34

标签: python machine-learning statistics data-science

我编写了一些代码,这些代码使用多线性模型从里程,汽缸,门,巡航,声音,皮革数据等功能预测汽车的价格。如快照中的示例数据:cars然后,我想检查模型中是否存在高度共线性的特征,以及它们是否影响模型质量,如下所示,我得到的结果是一个数组(我想这是一个VIF数组吗?),但是,我的理解是,每个VIF值都应代表两个要素之间的共线性,也就是说,它应该是矩阵而不是数组,对吗?如何检查数组的共线性?还是我应该以某种方式更改代码以获得矩阵?谢谢!

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
import scipy, scipy.stats
from sklearn.model_selection import train_test_split

cars = pd.read_csv('cars.csv')
cars.head()
cars.info()
X=cars[['Mileage', 'Cylinder', 'Doors', 'Cruise', 'Sound', 'Leather']].values
y=cars['Price'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
regressor = LinearRegression()  
regressor.fit(X_train, y_train)

from statsmodels.stats.outliers_influence import variance_inflation_factor
[variance_inflation_factor(X_train, j) for j in range(X_train.shape[1])]

我得到的输出: #cars.info():

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 804 entries, 0 to 803
Data columns (total 18 columns):
Price          804 non-null float64
Mileage        804 non-null int64
Cylinder       804 non-null int64
Doors          804 non-null int64
Cruise         804 non-null int64
Sound          804 non-null int64
Leather        804 non-null int64
Buick          804 non-null int64
Cadillac       804 non-null int64
Chevy          804 non-null int64
Pontiac        804 non-null int64
Saab           804 non-null int64
Saturn         804 non-null int64
convertible    804 non-null int64
coupe          804 non-null int64
hatchback      804 non-null int64
sedan          804 non-null int64
wagon          804 non-null int64
dtypes: float64(1), int64(17)
memory usage: 113.1 KB

#VIF:

[5.9882999105246935,
 13.522607316383963,
 10.893965772667245,
 4.564742540402573,
 2.8815915938492838,
 3.6030229813600663]

1 个答案:

答案 0 :(得分:0)

方差膨胀因子(VIF)是衡量模型中所有参数的估计值与添加该变量的模型的参数估计值相比所增加的方差的量度缺席。 VIF没有提供“两个特征之间的共线性”的比较,因为它没有选择两个不同的特征进行比较。

您在此行生成的值列表:

[variance_inflation_factor(X_train, j) for j in range(X_train.shape[1])]

是比较不包含 X_j 的模型的参数估计值与不包含 X_j 的模型的估计值时得出的VIF值的列表, 全部 X_j

具体来说,列表中的第一个VIF是5.9882999105246935,对应于 X_mileage 的VIF。这告诉您,包含所有其他变量以及 X_mileage 的模型的参数估计值的方差大约是不包含该模型的模型的参数估计值的6倍 X_mileage X_cylinder 的方差增加了〜13.5倍,依此类推。

评估多重共线性的影响不是纯粹的统计问题。也就是说,除了完美的多重共线性(一个变量可以完美预测另一个变量的值)的情况外,没有明确的规则可以说变量应该或不应该包含在模型中。您将看到提供的各种指南,例如消除VIF> 5或有时VIF> 10的任何变量,但这仅是建议(尽管通常基于很好的推理)。