Почему это проблема? Как это проверить и исправить

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

Я столкнулся с серьезной проблемой мультиколлинеарности раньше, когда построил модель регрессии для данных временных рядов. Я создал несколько функций на основе разных периодов времени, таких как общий доход за 1 месяц, общий доход за 6 месяцев и общий доход за год, чтобы иметь больше входных переменных. Однако эти особенности сильно коррелируют друг с другом. Например, если одна акция показала хорошие результаты в прошлом году, то, скорее всего, она будет хорошо расти и в последний месяц. Мне нужно было бы либо отбросить некоторые из этих переменных, либо найти способ сделать их менее коррелированными. Позже в статье я объясню различные способы решения проблемы.

Почему проблема мультиколлинеарности?

Когда независимые переменные сильно коррелированы, изменение одной переменной вызовет изменение другой, поэтому результаты модели значительно колеблются. Результаты модели будут нестабильными и сильно варьироваться при небольшом изменении данных или модели. Это создаст следующие проблемы:

  1. Вам будет сложно выбрать список значимых переменных для модели, если модель каждый раз дает разные результаты.
  2. Оценки коэффициентов не будут стабильными, и вам будет сложно интерпретировать модель. Другими словами, вы не можете определить масштаб изменений выходных данных, если один из ваших факторов прогнозирования изменится на 1 единицу.
  3. Неустойчивый характер модели может вызвать переоснащение. Если вы примените модель к другой выборке данных, точность значительно упадет по сравнению с точностью вашего обучающего набора данных.

В зависимости от ситуации, это может не быть проблемой для вашей модели, если возникает только небольшая или умеренная проблема коллинеарности. Однако настоятельно рекомендуется решить эту проблему, если существует серьезная проблема коллинеарности (например, корреляция ›0,8 между двумя переменными или коэффициент инфляции дисперсии (VIF)› 20)

Как проверить, возникает ли мультиколлинеарность?

Первый простой метод - построить корреляционную матрицу всех независимых переменных.

Я использовал данные о жилье из конкурса Kaggle. Цель конкурса - использовать введенные данные о жилье для правильного прогнозирования продажной цены. Я выбрал несколько числовых переменных, которые будут включены в мою модель здесь.

#plot color scaled correlation matrix
corr=house_selected.corr()
corr.style.background_gradient(cmap='coolwarm')

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

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

Возвращаясь к проблеме мультиколлинеарности, мы видим, что из корреляционной матрицы довольно много переменных коррелированы друг с другом. Есть одна пара независимых переменных с корреляцией более 0,8, которые представляют собой общую площадь подвала и площадь первого этажа. Дома с большей площадью подвала, как правило, имеют большую площадь первого этажа, поэтому следует ожидать высокой корреляции.

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

#Compute VIF data for each independent variable
from statsmodels.stats.outliers_influence import variance_inflation_factor
vif = pd.DataFrame()
vif["features"] = house_selected.columns
vif["vif_Factor"] = [variance_inflation_factor(house_selected.values, i) for i in range(house_selected.shape[1])]
vif

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

Как исправить проблему мультиколлинеарности?

  1. Выбор переменной

Самый простой метод - удалить некоторые переменные, которые сильно коррелированы с другими, и оставить более значимые в наборе. Например, когда мы строим корреляционную матрицу с включенной «SalePrice», мы видим, что общее качество и жилая площадь имеют две наивысшие корреляции с зависимой переменной «SalePrice», и поэтому я попытаюсь включить их в модель.

Мы видим, что, используя простое исключение, мы можем значительно уменьшить значение VIF, сохранив при этом важные переменные. Однако некоторые из переменных, таких как «Общее качество» и «Годы постройки», по-прежнему имеют высокое значение VIF и важны для прогнозирования цен на жилье. Каким образом? Иногда мы можем использовать небольшие приемы, описанные ниже во втором методе, для преобразования переменной.

2. Преобразование переменной

Второй метод - преобразовать некоторые переменные, чтобы сделать их менее коррелированными, но при этом сохранить их свойства. Что я имею в виду? В примере модели жилья я могу перевести «годы постройки» в «возраст дома», вычтя текущий год из количества лет постройки. Например, если год постройки - 1994, то возраст дома 2020–1994 = 26 лет.

После того, как я переведу годы строительства в возраст дома, VIF для нового фактора «House_age» упадет до приемлемого диапазона, а значение VIF для общего качества также упадет.

В примере анализа временных рядов, который я упомянул в начале, я также преобразовал переменные, чтобы сделать их менее коррелированными. Например, общий доход за последний 1 месяц сильно коррелирует с общим доходом за последние 6 месяцев. Я вычел доходность за последний месяц из доходности за последние 6 месяцев, чтобы получить новую переменную для доходности за предыдущие 5 месяцев, которая не включает прошлый месяц. Результаты корреляции намного более приемлемы, и я смог включить обе переменные в качестве характеристик моей модели.

3. Анализ главных компонентов

Анализ главных компонентов (PCA) обычно используется для уменьшения размерности данных путем разложения данных на ряд независимых факторов. У него есть много приложений, таких как упрощение расчета модели за счет уменьшения количества факторов прогнозирования. Однако в нашем случае мы просто будем использовать символ независимости переменных для PCA, чтобы устранить проблему мультиколлинеарности в модели.

#Create the new data frame by transforming data using PCA
import numpy as np
from sklearn.decomposition import PCA
pca = PCA(n_components=6)
components=pca.fit_transform(house_adjusted)
componentsDf=pd.DataFrame(data=components,columns=['component 1','component 2','component 3','component 4','component 5','component 6'])
#Calculate VIF for each variable in the new data frame
vif = pd.DataFrame()
vif["features"] = componentsDf.columns
vif["vif_value"] = [variance_inflation_factor(componentsDf.values, i) for i in range(componentsDf.shape[1])]
vif

Я по-прежнему сохраняю то же количество переменных по сравнению с исходными данными, и мы видим, что теперь 6 переменных вообще не коррелированы друг с другом. Мы можем использовать новые 6 переменных в качестве независимых переменных для прогнозирования цен на жилье.

Недостаток этого метода также очень очевиден. После преобразования PCA у нас нет идентичности для каждой переменной, и будет сложно интерпретировать результаты.

Заключение и рекомендация

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

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

Как вы думаете, вы, наконец, закончили со всеми проверками со статистическими допущениями перед построением модели? Нет! Если вы хотите узнать больше о других статистических допущениях в регрессионной модели, обратитесь к другой моей статье ниже о допущении нормальности в регрессионной модели.