Обнаружение мультиколлинеарности с помощью VIF - Python

Опубликовано: 19 Июля, 2021

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

В методе VIF мы выбираем каждую функцию и сравниваем ее со всеми другими функциями. Для каждой регрессии коэффициент рассчитывается как:

Где R-квадрат - коэффициент детерминации линейной регрессии. Его значение находится в диапазоне от 0 до 1.

Как видно из формулы, чем больше значение R-квадрат, тем больше VIF. Следовательно, больший VIF означает большую корреляцию. Это согласуется с тем фактом, что более высокое значение R-квадрата означает более сильную коллинеарность. Как правило, VIF выше 5 указывает на высокую мультиколлинеарность.

Реализация VIF с использованием статистических моделей:

statsmodels предоставляет функцию с именем variance_inflation_factor () для вычисления VIF.

Syntax : statsmodels.stats.outliers_influence.variance_inflation_factor(exog, exog_idx)

Parameters :

  • exog : an array containing features on which linear regression is performed.
  • exog_idx : index of the additional feature whose influence on the other features is to be measured.

Давайте посмотрим на пример реализации метода в этом наборе данных.

Набор данных:

Набор данных, используемый в примере ниже, содержит рост, вес, пол и индекс массы тела для 500 человек. Здесь зависимой переменной является индекс .

Python3






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

Выход :

 Пол Рост Индекс веса
0 Мужской 174 96 4
1 Мужской 189 87 2
2 Женский 185 110 4
3 Женский 195104 3
4 Мужской 149 61 3

Подход :

  • Каждый из индексов характеристик передается в variance_inflation_factor (), чтобы найти соответствующий VIF.
  • Эти значения хранятся в форме фрейма данных Pandas.

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)

Выход :

 особенность VIF
0 Пол 2.028864
1 Высота 11.623103
2 Вес 10.688377

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

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.