Обработка сдвига ковариат и многоколлинеарности в одном наборе данных

Вопрос или проблема

Проблема связана с регрессионной задачей.

Я получаю партии данных из источника эксперимента, который имеет примерно 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

Ссылка: https://stackoverflow.com/questions/29294983/how-to-calculate-correlation-between-all-columns-and-remove-highly-correlated-on

Когда я запускаю этот фрагмент кода, общее количество признаков сокращается с 3000 до 3-4.

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

Например, после выполнения приведенного выше фрагмента кода, скажем, у меня остались столбцы 100, 1700 и 3000, корреляция между этими переменными в моем обучающем наборе совершенно отличается от моего валидационного набора. В моем обучающем наборе корреляция между столбцами 100 и 3000 составляет 0.29, а в моем валидационном наборе – -0.13.

Мне действительно нужна помощь в понимании того, как я могу решить подобные проблемы, потому что это совершенно новое для меня.

То, что происходит в валидации, имеет хорошие шансы произойти в производстве.

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

Я предлагаю исправить сдвиг ковариат, применяя отношение ri=pi(x)/qi(x) для каждого столбца и применяя это к вашей функции потерь.

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

Ответ или решение

Обработка ковариантного сдвига и мультиколлинеарности в одном наборе данных

Введение

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

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

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

Рекомендации по устранению мультиколлинеарности:

  1. Расчет корреляции и удаление столбцов:

    • Замените текущую реализацию функции на выбор более оптимального метода, например, отбор через метод главных компонент (PCA). PCA может помочь уменьшить размерность данных, сохраняя при этом как можно больше информации.
  2. Использование Lasso-регрессии:

    • Lasso (L1-регуляризация) может помочь в автоматическом устранении мультиколлинеарных переменных, вводя штраф за количество ненулевых коэффициентов.
  3. Отбор признаков:

    • Используйте методы, такие как рекурсивный отбор признаков (Recursive Feature Elimination, RFE), чтобы систематически оценивать важность каждого признака и исключать менее значимые.

Ковариантный сдвиг

Ковариантный сдвиг (covariate shift) происходит, когда распределение предикторов в обучающей выборке отличается от валидационной выборки. Это обусловлено изменением внешних условий или свойств потока данных.

Подходы к исправлению ковариантного сдвига:

  1. Стандартизация и нормализация:

    • Примените Z-нормализацию или метод Min-Max, чтобы сопоставить распределения признаков в обучающей и валидационной выборках. Обязательно используйте параметры, полученные из обучающей выборки, для нормализации валидационной выборки.
  2. Диспетчеризация правдоподобия:

    • Рассмотрите возможность применения веса для наблюдений в обучающей выборке, чтобы учитывать разницу в распределениях. Это позволит скорректировать влияние этих наблюдений быстрее.
  3. Использование распределенных методов оценки:

    • Примените подходы на основе функционального анализа, такие как правдоподобие или метод максимального правдоподобия, чтобы скорректировать отклонения в распределениях.
  4. Тестирование на устойчивость модели:

    • Проверьте свою модель на устойчивость, используя различные порции данных, и уделите внимание своим метрикам, таким как RMSE и R², чтобы убедиться в стабильности результатов.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...