Фактор инфляции дисперсии (VIF): Решение проблемы мультиколлинеарности в анализе регрессии

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

Фактор инфляции дисперсии (VIF) – отличный инструмент для выявления мультиколлинеарности, предлагая инсайты за пределами простых попарных корреляций. В этом руководстве объясняется, как работает VIF, как его рассчитывать и интерпретировать, а также что делать, если обнаружены высокие значения VIF. Эти шаги помогут вам, как специалистам по данным и дата-саентистам, улучшить стабильность вашей модели.

Хотя VIF является важным диагностическим инструментом и его стоит изучить, он представляет лишь малую часть более широкого набора навыков, которые вы приобретете в нашей карьерной программе Machine Learning Scientist in Python, поэтому записывайтесь сегодня.

Что такое фактор инфляции дисперсии (VIF)?

Разработанный статистиком Катбертом Даниэлем, VIF – широко используемый диагностический инструмент в анализе регрессии для выявления мультиколлинеарности, которая известна своим влиянием на стабильность и интерпретируемость коэффициентов регрессии. Более технически VIF работает путем количественной оценки того, насколько дисперсия коэффициента регрессии увеличивается из-за корреляций между предикторами.

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

Формула фактора инфляции дисперсии

Значение VIF для предиктора X рассчитывается следующим образом:

Где:

  • R2 – коэффициент детерминации, полученный при регрессии X на все остальные предикторы.

Пошаговый расчет

Расчет VIF состоит из трех этапов. Первый этап – подгонка отдельной линейной регрессионной модели для каждого предиктора по отношению ко всем остальным предикторам. Второй этап – получение значения R2 для каждой модели. Финальный этап – расчет VIF с использованием формулы выше.

Интерпретация значений VIF

Вот как интерпретировать значения VIF, чтобы понять уровень мультиколлинеарности:

  • VIF = 1: Это указывает на отсутствие мультиколлинеарности. Предиктор не коррелирует с другими предикторами, поэтому не увеличивает стандартную ошибку или не влияет на стабильность модели.
  • VIF между 1 и 5: Это указывает на умеренную мультиколлинеарность. Существует определенная корреляция с другими предикторами, но обычно она не является серьезной. Тем не менее, стоит следить за этими предикторами, чтобы увидеть, станет ли мультиколлинеарность проблемой, особенно если другие значения VIF высокие.
  • VIF > 5: Высокая мультиколлинеарность присутствует. Стандартная ошибка прогностической переменной может быть значительно завышена, что может сделать её коэффициент менее надёжным. Рассмотрите возможность принятия мер по снижению мультиколлинеарности, например, путём удаления или объединения коррелированных прогностических переменных.
  • VIF > 10: Это сигнализирует о серьёзной мультиколлинеарности. Стандартная ошибка прогностической переменной сильно завышена, и оценка её коэффициента, вероятно, нестабильна. Обычно требуются корректирующие действия, такие как удаление прогностической переменной или использование техник регуляризации.

Например, если VIF прогностической переменной равно 10, это указывает на то, что дисперсия коэффициента этой прогностической переменной в 10 раз выше, чем если бы не было мультиколлинеарности.

Как VIF объясняет мультиколлинеарность в регрессии

Мультиколлинеарность приводит к увеличению стандартных ошибок, что затрудняет оценку значимости отдельных предикторов. Это происходит потому, что коллинеарные переменные несут схожую информацию, что затрудняет разделение их конкретных индивидуальных эффектов на зависимую переменную.

Хотя мультиколлинеарность не обязательно вредит способности модели к прогнозированию, она уменьшает надежность и ясность коэффициентов. Это особенно проблематично, когда нам нужно понять индивидуальное влияние каждого предиктора.

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

Фактор инфляции дисперсии в Python и R

Для того чтобы сделать это действительным, давайте пройдем через пример как на Python, так и на R с использованием уникального набора данных. Мы будем вычислять VIF с использованием автоматизированных пакетов и также с использованием формулы VIF для построения интуиции. Для того чтобы практиковаться, я специально создал набор данных, где мы обнаружим высокое значение VIF для одной из наших переменных, даже если нет очень высокой попарной корреляции между любыми двумя переменными – поэтому я считаю, что это убедительный пример. Давайте начнем с обзора набора данных, который мы будем использовать.

Обзор набора данных:

Этот вымышленный набор данных представляет результаты опроса, проведенного в 1000 магазинах ритейлового гиганта. Покупателей в каждом магазине попросили оценить различные аспекты своего шопинг-опыта по шкале от -5 до +5, где -5 указывает на очень негативный опыт, а +5 указывает на очень позитивный опыт. Средняя оценка покупателей в каждом магазине была взята по четырем ключевым параметрам:

  • Атмосфера: Восприятие клиентом окружающей среды магазина, такое как чистота, планировка, освещение и общая атмосфера.

  • Обслуживание_клиентов: Оценка обслуживания, предоставляемого персоналом магазина, включая отзывчивость, дружелюбие и готовность к удовлетворению потребностей клиента.

  • Предложения: Оценка рекламных предложений, скидок и акций, доступных для клиентов в магазине.

  • Product_range: Оценка ассортимента и качества товаров, доступных в магазине.

Целевая переменная, Performance, измеряет общую производительность каждого магазина. Однако с точки зрения VIF это не имеет значения. Вы можете скачать набор данных здесь.

Фактор инфляции дисперсии в Python

Мы начнем с расчета значений VIF с использованием пакетов Python. Первым шагом будет загрузка набора данных и необходимых библиотек.

from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from statsmodels.stats.outliers_influence import variance_inflation_factor from statsmodels.tools.tools import add_constant datacamp_retail_data = pd.read_csv(' vif_data.csv') datacamp_retail_data.head()

Приведенный выше код загрузит данные и отобразит первые пять записей.

В качестве следующего шага мы можем запустить матрицу корреляции для проверки попарной корреляции.

Ниже приведен код, который выбирает четыре столбца и сохраняет их в новом DataFrame с именем correl_data. Затем он вычисляет матрицу попарных корреляций с помощью функции .corr(). Результат сохраняется в объекте corr_matrix, который представляет собой таблицу, показывающую коэффициенты корреляции между каждой парой выбранных столбцов.

Затем матрица визуализируется с помощью функции heatmap() библиотеки Seaborn, отображая каждый коэффициент корреляции как ячейку, закрашенную определенным цветом, где синий обозначает отрицательные корреляции, а красный – положительные корреляции, на основе цветовой карты coolwarm.

correl_data = datacamp_retail_data[['Ambience', 'Customer_service', 'Offers', 'Product_range']] # Вычислить матрицу попарных корреляций corr_matrix = correl_data.corr() # Визуализировать матрицу корреляций plt.figure(figsize=(10, 8)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1) plt.title('Pairwise Correlation Matrix') plt.show()

Вывод:

  Связь между переменными. Изображение автора

График предоставляет визуальное обобщение отношений между переменными в correl_data. Значения корреляции варьируются от -1 до 1, где значения, близкие к 1, указывают на сильную положительную корреляцию, значения, близкие к -1, указывают на сильную отрицательную корреляцию, а значения около 0 подразумевают отсутствие корреляции. Очевидно, что сильной парной корреляции между переменными нет, поскольку ни одно из значений корреляции не превышает даже 0,6.

Следующим шагом является расчет значений VIF для предикторных переменных. Приведенный ниже код вычисляет значения для каждой предикторной переменной в наборе данных для проверки на мультиколлинеарность.

Сначала он определяет переменную X, удаляя целевой столбец Performance и добавляя перехват. Затем создает DataFrame datacamp_vif_data, чтобы сохранить имена предикторов и их значения VIF. С помощью цикла затем вычисляет VIF для каждого предиктора с помощью variance_inflation_factor() функции, где более высокие значения VIF указывают на наличие мультиколлинеарности.

# Определение предикторных переменных X = datacamp_retail_data.drop(columns=['Performance']) # Добавление константы к модели (перехват) X = add_constant(X) # Расчет VIF для каждого признака datacamp_vif_data = pd.DataFrame() datacamp_vif_data['Feature'] = X.columns datacamp_vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] print(datacamp_vif_data)

Вывод:

Вывод отображает значения VIF. Изображение от автора

Этот вывод показывает значение VIF для каждой предикторной переменной, указывая уровень мультиколлинеарности в наборе данных. Строка const представляет собой термин перехвата с VIF близким к 1, что означает отсутствие мультиколлинеарности. Среди предикторных переменных Product_range имеет наивысший VIF (5.94), что указывает на необходимость корректирующих мер. Все остальные предикторы имеют значения VIF ниже 3, что указывает на низкую мультиколлинеарность.

Ручной подход к расчету VIF

Другой подход заключается в расчете значений отдельно путем регрессии каждой независимой переменной по отношению к другим предикторным переменным.

Таким образом, для каждой характеристики в retail_data устанавливается эту характеристику в качестве зависимой переменной (y), а оставшиеся характеристики – в качестве независимых переменных (X). Затем подгоняется линейная регрессионная модель для прогнозирования y с использованием X, и значение R-квадрат модели используется для расчета VIF с использованием формулы, о которой мы говорили в начальном разделе.

Впоследствии каждая функция и их соответствующие значения VIF сохраняются в словаре (vif_manual), который затем преобразуется в DataFrame (vif_manual_df) для отображения.

datacamp_retail_data = retail_data.drop(columns=['Performance']) # Ручной расчет VIF vif_manual = {} for feature in retail_data.columns: # Определение целевой переменной (текущей функции) и предикторов (всех остальных функций) y = datacamp_retail_data[feature] X = datacamp_retail_data.drop(columns=[feature]) # Подгонка модели линейной регрессии model = LinearRegression().fit(X, y) # Расчет R-квадрат r_squared = model.score(X, y) # Расчет VIF vif = 1 / (1 - r_squared) vif_manual[feature] = vif # Преобразование словаря в DataFrame для лучшего отображения vif_manual_df = pd.DataFrame(list(vif_manual.items()), columns=['Feature', 'VIF']) print(vif_manual_df)

 Вывод:

Вывод, показывающий значения VIF. Изображение автора

Вывод показывает каждую функцию вместе со значением VIF, что помогает выявить потенциальные проблемы мультиколлинеарности. Вы видите, что результат очевидно тот же, что и выше; и таково будет его интерпретация, которая говорит о том, что переменная Product_range демонстрирует мультиколлинеарность.

Фактор инфляции дисперсии в R

В этом разделе мы повторим упражнение вышеуказанного фактора инфляции дисперсии в разделе Python, особенно для разработчиков, работающих с языком программирования R. Мы начнем с загрузки набора данных и необходимых библиотек.

library(tidyverse) library(car) library(corrplot) data <- read.csv('vif_data.csv') str(data)

Вывод:

Следующим шагом будет вычисление попарной корреляционной матрицы и ее визуализация с помощью тепловой карты. Функции cor() и corrplot помогут нам выполнить это задание.

# Удалите целевой столбец predictors_data <- data[, !(names(data) %in% "Performance")] # Рассчитайте матрицу корреляции correlation_matrix <- cor(predictors_data) # Постройте тепловую карту корреляции # Загрузите необходимые библиотеки library(ggplot2) library(reshape2) melted_corr_matrix <- melt(correlation_matrix) # Постройте тепловую карту с помощью ggplot2 ggplot(data = melted_corr_matrix, aes(x = Var1, y = Var2, fill = value)) + geom_tile(color = "white") + scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit = c(-1, 1), space = "Lab", name="Correlation") + theme_minimal() + # Минимальная тема для чистого вида theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + labs(x = "", y = "") + # Удалите подписи осей geom_text(aes(Var1, Var2, label = round(value, 2)), color = "black", size = 4) + theme(axis.text=element_text(size=15))

Вывод:

Корреляция между переменными. Изображение автора

Из корреляционной тепловой карты видно, что сильной парной корреляции между переменными нет, поскольку ни одно из значений корреляции не превышает 0.6. Теперь мы вычислим значения VIF и посмотрим, есть ли что-то тревожное. Этот блок кода выполняет эту задачу.

# Подгоните модель регрессии model <- lm(Performance ~ Ambience + Customer_service + Offers + Product_range, data = data) # Рассчитайте VIF vif(model)

Вывод:

Из вывода можно видеть, что среди предикторных переменных только переменная Product_range имеет значение VIF больше 5, что указывает на высокую мультиколлинеарность, требующую корректирующих мер. 

Ручной подход к расчету VIF

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

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

Затем значение R-квадрат из каждой модели используется для вычисления значений VIF по формуле. Наконец, результат, vif_values, отображает VIF для каждого предиктора, помогая выявить проблемы мультиколлинеарности.

# Расчет VIF для каждого предиктора вручную predictors <- c("Ambience", "Customer_service", "Offers", "Product_range") vif_values <- sapply(predictors, function(pred) { formula <- as.formula(paste(pred, "~ .")) model <- lm(formula, data = data[, predictors]) 1 / (1 - summary(model)$r.squared) }) print(vif_values)

Вывод:

Мы получаем тот же результат, и явно видно, что переменная Product_range с высоким значением VIF выше 5 требует вмешательства.

VIF против матрицы корреляции и других методов

В качестве подведения итогов, вот популярные методы обнаружения мультиколлинеарности:

  • Высокие значения VIF: Высокое значение VIF четко указывает на мультиколлинеарность. Когда эти значения превышают определенные пороги, это указывает на то, что предиктор сильно связан с другими предикторами, что может повлиять на стабильность, надежность и производительность модели.
  • Корреляционные матрицы: Анализируя корреляционную матрицу, можно увидеть парные корреляции между предикторами. Высокие парные корреляции указывают на мультиколлинеарность между этими конкретными предикторами. Однако этот метод обнаруживает только прямые линейные отношения между двумя переменными и может упустить мультиколлинеарность, касающуюся более сложных взаимодействий между несколькими переменными.
  • Изменения коэффициентов: Если коэффициенты предикторов значительно меняются при добавлении или удалении других переменных из модели, это может быть признаком мультиколлинеарности. Такие флуктуации указывают на то, что определенные предикторы могут обмениваться общей информацией, что затрудняет определение уникального воздействия каждой переменной на результат.

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

Дополнительные идеи по решению высоких значений VIF

Если значения VIF указывают на высокую мультиколлинеарность, и вы не хотите просто удалять переменную, есть еще некоторые другие, более продвинутые стратегии по смягчению мультиколлинеарности:

  1. Выбор признаков: Удалите один из сильно коррелирующих предикторов и пересчитайте VIF, чтобы увидеть, поможет ли это упростить модель и улучшить стабильность.
  2. Метод главных компонент (PCA): Используйте PCA, чтобы объединить ваши предикторы в более маленький набор некоррелирующих компонент. Это преобразует исходные переменные в новые, независимые и некоррелированные, захватывающие большую часть вариации данных, что помогает решить проблему мультиколлинеарности, не теряя ценной информации.
  3. Техники регуляризации: Примените гребневую или лассо регрессию, которые добавляют штрафные члены к модели. Эти техники помогают уменьшить мультиколлинеарность, уменьшая влияние коррелирующих переменных, что делает модель более стабильной и надежной.

Заключение

Знание того, как использовать VIF, является ключом к выявлению и устранению мультиколлинеарности, что повышает точность и ясность регрессионных моделей. Регулярная проверка значений VIF и применение корректирующих мер при необходимости помогает специалистам по данным и аналитикам создавать модели, которым можно доверять. Такой подход обеспечивает ясность влияния каждого предиктора, что упрощает вывод надежных заключений из модели и принятие лучших решений на основе результатов. Возьмите наш курс Машинное обучение на языке Python для ученых, чтобы действительно понять, как строить модели и использовать их. Кроме того, завершение программы выглядит великолепно в резюме.

Также, для дальнейшего обучения, рассмотрите изучение следующих ресурсов из блога и разделов учебных пособий DataCamp:

Source:
https://www.datacamp.com/tutorial/variance-inflation-factor