Вопрос или проблема
Проблема связана с регрессионной задачей.
Я получаю партии данных из источника эксперимента, который имеет примерно 3 тысячи столбцов. Однако я заметил, что почти 99% столбцов сильно коррелируют друг с другом.
Набор данных выглядит примерно так, где мне нужно предсказать переменную Y на основе предоставленных числовых признаков:
ID | 1 | 2 | 3 | …. | 3000 | 3001 | Y |
---|---|---|---|---|---|---|---|
1 | 500 | 510 | 520 | …. | 67800 | 68900 | 0.12 |
2 | 700 | 710 | 720 | …. | 72800 | 76900 | 0.13 |
3 | 950 | 960 | 967 | …. | 74800 | 78900 | 0.52 |
4 | 989 | 992 | 999 | …. | 87800 | 88900 | 0.44 |
Тем не менее, корреляция между переменными крайне высокая. Например, столбцы с 100 по 500 будут иметь корреляцию 0.9997-0.9998 или даже 1 между ними, а снова столбцы с 1000 по 2000 будут иметь очень высокую корреляцию и так далее.
Интересный факт в том, что по мере увеличения количества столбцов столбец с более высоким значением будет иметь более низкую корреляцию со столбцом с более низким значением, то есть 100 имеет очень высокую корреляцию до 1500, скажем, но будет иметь низкую корреляцию со столбцами, такими как 2800/3000, и аналогично для более высоких столбцов, то есть столбцы 2800/3000 будут иметь очень высокую корреляцию со столбцами 2000/2500, но низкую корреляцию с крайними левыми столбцами.
Я использую следующий фрагмент кода, чтобы удалить столбцы и решить проблему мультиколлинеарности:
def correlation(dataset, threshold):
col_corr = set() # Множество всех имен удаленных столбцов
corr_matrix = dataset.corr()
for i in range(len(corr_matrix.columns)):
for j in range(i):
if (corr_matrix.iloc[i, j] >= threshold) and (corr_matrix.columns[j] not in col_corr):
colname = corr_matrix.columns[i] # получение имени столбца
col_corr.add(colname)
if colname in dataset.columns:
del dataset[colname] # удаление столбца из набора данных
return dataset
Когда я запускаю этот фрагмент кода, общее количество признаков сокращается с 3000 до 3-4.
Но проблема в том, что, когда я запускаю эту функцию на своем обучающем наборе, количество столбцов, которые я получаю, отличается от столбцов, которые я получаю из своего валидационного набора. Поэтому, когда я пытаюсь сохранить одни и те же столбцы из обучения в валидации, я вижу, что распределение значений столбцов изменилось значительно (сдвиг ковариат) и также изменилось соотношение корреляций.
Например, после выполнения приведенного выше фрагмента кода, скажем, у меня остались столбцы 100, 1700 и 3000, корреляция между этими переменными в моем обучающем наборе совершенно отличается от моего валидационного набора. В моем обучающем наборе корреляция между столбцами 100 и 3000 составляет 0.29, а в моем валидационном наборе – -0.13.
Мне действительно нужна помощь в понимании того, как я могу решить подобные проблемы, потому что это совершенно новое для меня.
То, что происходит в валидации, имеет хорошие шансы произойти в производстве.
Вот почему сокращение признаков до минимума может не быть лучшим решением, даже если это математически верно, из-за проблемы распределения, которую вы упомянули.
Я предлагаю исправить сдвиг ковариат, применяя отношение ri=pi(x)/qi(x) для каждого столбца и применяя это к вашей функции потерь.
Идея состоит в том, чтобы иметь похожие распределения, чтобы в конечном итоге достичь похожих корреляций.
Ответ или решение
Обработка ковариантного сдвига и мультиколлинеарности в одном наборе данных
Введение
Регрессионные модели часто сталкиваются с проблемами мультиколлинеарности и ковариантного сдвига при работе с большими наборами данных. В данном случае у вас более 3000 столбцов, многие из которых имеют высокую корреляцию друг с другом, что создает трудности для адекватной модели. Давайте разберем, как обработать эти проблемы, и предложим эффективные решения.
Проблема мультиколлинеарности
Мультиколлинеарность возникает, когда два или более предиктора в модели высоко коррелируют друг с другом. Это может привести к нестабильности коэффициентов регрессии, а также к проблемам с интерпретацией. В вашем случае вы уже применили метод удаления коррелированных столбцов, но получили разные результаты для обучающей и валидационной выборок, что вызывает дополнительные сложности.
Рекомендации по устранению мультиколлинеарности:
-
Расчет корреляции и удаление столбцов:
- Замените текущую реализацию функции на выбор более оптимального метода, например, отбор через метод главных компонент (PCA). PCA может помочь уменьшить размерность данных, сохраняя при этом как можно больше информации.
-
Использование Lasso-регрессии:
- Lasso (L1-регуляризация) может помочь в автоматическом устранении мультиколлинеарных переменных, вводя штраф за количество ненулевых коэффициентов.
-
Отбор признаков:
- Используйте методы, такие как рекурсивный отбор признаков (Recursive Feature Elimination, RFE), чтобы систематически оценивать важность каждого признака и исключать менее значимые.
Ковариантный сдвиг
Ковариантный сдвиг (covariate shift) происходит, когда распределение предикторов в обучающей выборке отличается от валидационной выборки. Это обусловлено изменением внешних условий или свойств потока данных.
Подходы к исправлению ковариантного сдвига:
-
Стандартизация и нормализация:
- Примените Z-нормализацию или метод Min-Max, чтобы сопоставить распределения признаков в обучающей и валидационной выборках. Обязательно используйте параметры, полученные из обучающей выборки, для нормализации валидационной выборки.
-
Диспетчеризация правдоподобия:
- Рассмотрите возможность применения веса для наблюдений в обучающей выборке, чтобы учитывать разницу в распределениях. Это позволит скорректировать влияние этих наблюдений быстрее.
-
Использование распределенных методов оценки:
- Примените подходы на основе функционального анализа, такие как правдоподобие или метод максимального правдоподобия, чтобы скорректировать отклонения в распределениях.
-
Тестирование на устойчивость модели:
- Проверьте свою модель на устойчивость, используя различные порции данных, и уделите внимание своим метрикам, таким как RMSE и R², чтобы убедиться в стабильности результатов.
Заключение
Работа с высокоразмерными данными и проблемами, связанными с ковариантным сдвигом и мультиколлинеарностью, требует применения продвинутых методов анализа данных и тщательного отбора признаков. Важно понимать, что выбросы и сдвиг распределения могут существенно влиять на качество предсказаний модели. Применяя методы, такие как PCA, Lasso и правильная стандартизация, вы сможете улучшить вашу модель и минимизировать влияние проблем, связанных с высокими корреляциями и изменениями в данных между обучающей и валидационной выборками.