Вопрос или проблема
У меня есть большой датафрейм с почти миллионом строк и 2000 столбцов. Я пытаюсь сделать отбор признаков, используя корреляцию между переменными. Проблема в том, что для набора из n признаков нам нужна корреляция между nC2 или n*(n-1)/2 комбинациями, что делает операцию по сути O(n^2).
Поэтому я хочу узнать, можем ли мы оптимизировать это, используя стратегию “разделяй и властвуй”, как указано ниже:
- вычислить корреляцию между 20 партиями по 100 столбцов каждая
- исключить сильно коррелирующие признаки (порог > 95%)
- объединить оставшиеся признаки (скажем, около 1000), снова разделить на 20 партий
- повторить вышеуказанный процесс, пока не достигнем фиксированного порога столбцов (которые мы можем обрабатывать вместе, скажем, 200)
- вычислить корреляцию в последний раз и исключить коррелирующие признаки
Я хотел знать, будет ли этот метод работать, или есть ли более оптимизированные методы, которые мы можем использовать для этой цели. Я также хочу узнать, будет ли это работать для разных типов корреляций, таких как Спирмена, Кендалла и т.д.
Этот метод делает одно важное предположение:
- если f1 и f2 имеют корреляцию >95%, f2 и f3 также имеют корреляцию >95%, то мы предполагаем, что f1 и f3 также имеют корреляцию >95%.
Я не уверен, есть ли конкретная теоретическая основа для этого, и хотел бы услышать ваше мнение о том, как это доказать для разных типов корреляций.
Ответ или решение
Оптимизированные алгоритмы для устранения признаков на основе корреляции
Ваша задача по устранению признаков в большом датафрейме с почти миллионом строк и 2000 столбцов заслуживает детального анализа и обсуждения. Действительно, выполнение корреляционного анализа для такого количества столбцов может оказаться трудоемким требованием с точки зрения вычислительных ресурсов, особенно если ваш подход основан на вычислении корреляции для каждой пары признаков (O(n^2)). Давайте рассмотрим ваш подход и возможные оптимизации более подробно.
Предложенный Метод
Ваше предложение разбить данные на 20 партий по 100 столбцов звучит разумно и потенциально может снизить вычислительную нагрузку. Следующие этапы вашего метода предполагаются правильными:
-
Разбиение на партии: Распределение 2000 признаков на партии по 100 столбцов позволяет вам последовательно оценивать корреляцию. Сначала вы вычисляете корреляцию между признаками в каждой партии, что снижает объем необходимых вычислений.
-
Удаление высоко коррелирующих признаков: Удаление признаков с корреляцией выше 95% на каждой итерации может помочь сократить количество признаков на следующих этапах.
-
Итеративный процесс: Объединение оставшихся признаков и повторное разбиение на партии помогает обнаруживать коррелированные пары, которые могли быть пропущены на первой итерации.
-
Финальная оценка: После достижения установленных морфологических ограничений (например, 200 признаков) финальная корреляция может быть рассчитана, для окончательного удаления высоко коррелирующих признаков.
Обоснование Подхода
Ваш метод подразумевает, что высокая корреляция между признаками (например, 95%) может быть "транзитивной". Это соглашение имеет свои недостатки. Высокая корреляция между f1 и f2, а также между f2 и f3 не гарантирует, что f1 и f3 также будут высоко коррелировать. Эта зависимость требует тщательной проверки, и было бы полезно протестировать эту гипотезу на вашем наборе данных.
Также стоит отметить, что в случае, если корреляция не является линейной (как в случае с методами Спирмена или Кендалла), транзитивность может не выполняться. Поэтому использование различных типов корреляций потребуется отдельно оценить.
Оптимизация Алгоритмов
При эксплуатации больших наборов данных, запись выполнения алгоритмов может улучшить их производительность. Вот некоторые из методов, которые могут помочь вам оптимизировать процесс корреляционного анализа:
-
Использование Hadoop или Spark: Для обработки каждого поднабора данных можно воспользоваться распределенными вычислительными системами, такими как Apache Spark. Это позволит эффективно обработать данные параллельно.
-
Пакетная обработка с использованием блока: Вместо обработки одного признака за раз, реализуйте пакетную обработку, где несколько признаков обрабатываются одновременно.
-
Алгоритмы приближения: Рассмотрите возможность использования приближенных алгоритмов для оценки корреляции, которые могут быть менее затратными по времени в расчете.
-
Уменьшение размерности: Такие методы, как PCA (анализ главных компонент), могут помочь в снижении размерности данных до более управляемого уровня перед выполнением корреляции.
-
Использование библиотек: Используйте специальные библиотеки для анализа корреляции, такие как Dask или Vaex, которые оптимизированы для работы с большими наборами данных.
Заключение
Предложенный вами метод является направленным и содержит разумные этапы для обработки большого количества признаков. Однако, для достижения надежных результатов следует учитывать особенности корреляций разных типов и убеждаться в том, что ваши предположения о транзитивности справедливы. Применяя методы распределенных вычислений и пакетной обработки, можно значительно оптимизировать процесс устранения признаков на основе корреляции.
Для реализации описанных методов потребуется экспериментировать с вашими данными и оценивать производительность предложенных решений. Направление, в котором вы движетесь, имеет потенциал, и его можно эффективно использовать для обработки больших массивов данных.