График предоставляет визуальное обобщение отношений между переменными в 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 указывают на высокую мультиколлинеарность, и вы не хотите просто удалять переменную, есть еще некоторые другие, более продвинутые стратегии по смягчению мультиколлинеарности:
- Выбор признаков: Удалите один из сильно коррелирующих предикторов и пересчитайте VIF, чтобы увидеть, поможет ли это упростить модель и улучшить стабильность.
- Метод главных компонент (PCA): Используйте PCA, чтобы объединить ваши предикторы в более маленький набор некоррелирующих компонент. Это преобразует исходные переменные в новые, независимые и некоррелированные, захватывающие большую часть вариации данных, что помогает решить проблему мультиколлинеарности, не теряя ценной информации.
- Техники регуляризации: Примените гребневую или лассо регрессию, которые добавляют штрафные члены к модели. Эти техники помогают уменьшить мультиколлинеарность, уменьшая влияние коррелирующих переменных, что делает модель более стабильной и надежной.
Заключение
Знание того, как использовать VIF, является ключом к выявлению и устранению мультиколлинеарности, что повышает точность и ясность регрессионных моделей. Регулярная проверка значений VIF и применение корректирующих мер при необходимости помогает специалистам по данным и аналитикам создавать модели, которым можно доверять. Такой подход обеспечивает ясность влияния каждого предиктора, что упрощает вывод надежных заключений из модели и принятие лучших решений на основе результатов. Возьмите наш курс Машинное обучение на языке Python для ученых, чтобы действительно понять, как строить модели и использовать их. Кроме того, завершение программы выглядит великолепно в резюме.
Source:
https://www.datacamp.com/tutorial/variance-inflation-factor