Как интерпретировать VIF в этом случае? - PullRequest
0 голосов
/ 12 февраля 2020

Я написал несколько кодов, которые используют мультилинейную модель для прогнозирования цены автомобиля на основе таких характеристик, как пробег, цилиндр, двери, круиз, звук, кожа. Пример данных, как на снимке: автомобили Затем я хочу проверить, есть ли какие-либо функции в модели, которые имеют высокую коллинеарность, и влияют ли они на качество модели, как показано ниже, в результате я получил массив (я полагаю, что это массив 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 голосов
/ 13 февраля 2020

Коэффициент инфляции дисперсии (VIF) представляет собой меру того, насколько увеличивается дисперсия оценок всех параметров в модели при добавлении определенной переменной c по сравнению с оценками параметров для модели, где эта переменная отсутствует. VIF не дает вам сравнение «коллинеарности между двумя функциями», так как он не выбирает две разные функции для сравнения.

Список значений, которые вы генерируете с помощью этой строки:

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

Это список значений VIF, которые получаются при сравнении отклонений в оценках параметров для модели, которая выполняет не включать X_j в оценки для модели, которая включает X_j , для всех X_j .

Если говорить точнее, первый VIF в списке будет 5.9882999105246935, что соответствует VIF для X_m Пробег . Это говорит о том, что дисперсия оценок параметров для модели, которая включает все остальные переменные, плюс X_m Пробег примерно в 6 раз выше, чем для модели, которая не включает X_mileage . Увеличение дисперсии для X_cylinder в ~ 13,5 раз выше и так далее.

Оценка влияния мультиколлинеарности не является чисто статистическим вопросом. То есть, кроме случая идеальной мультиколлинеарности (одна переменная точно предсказывает значение другой), нет четкого правила, согласно которому переменная должна или не должна включаться в модель. Вы увидите различные предлагаемые рекомендации, такие как исключение любой переменной с VIF> 5 или иногда VIF> 10, но это только предположения (хотя часто основанные на очень веских доводах).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...