Анализ существующих методов и предлагаемое решение

Обновление: обновленную функцию корреляции Python, описанную в этой статье, можно найти в пакете exploretransform на PYPI.

Резюме

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

Пример

Давайте посмотрим на пример того, как текущие методы удаляют функции, которые должны были остаться в наборе данных. Мы будем использовать обновленный набор данных Boston Housing и покажем примеры как на R, так и на Python.

R: В приведенном ниже коде используется функция findCorrelation () из пакета вставки, чтобы определить, какие столбцы следует удалить.

Функция определила, что [‘indus’, ‘nox. ‘Lstat’, ‘age’, ‘dis’] следует опустить на основании порогового значения корреляции 0,6.

Python: в Python нет встроенной функции, такой как findCorrelation (), поэтому я написал функцию под названием corrX_orig ().

Мы получаем тот же результат, что и R: drop columns [‘indus’, ‘nox’. ‘Lstat’, ‘age’, ‘dis’]

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

Как работают эти функции?
Сначала создается корреляционная матрица. Эти числа представляют собой попарные корреляции для всех комбинаций числовых переменных.

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

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

Вот псевдокод, демонстрирующий, как работает остальная часть функции. Я жестко запрограммировал 0,6 в качестве порога корреляции для этого примера:

Теперь о том, чего вы ждали. Почему функции не должны терять возраст?

Ниже приведена таблица, в которой показаны переменные, полученные мной из исходной функции. Помните, что функции сказали нам удалить [‘indus’, ‘nox’. ‘Lstat’, ‘age’, ‘dis’]. Поэтому мы вручную удаляем [‘indus’, ‘nox’, ‘lstat’, ‘dis’] из таблицы. Как видно из таблицы, не осталось других переменных, которые можно было бы сравнить с возрастом, чтобы принять решение об отказе. Поэтому возраст не следует сбрасывать со счетов.

Но почему это происходит?

Из-за последовательного характера функций R и Python они не могут рассматривать состояние всех переменных в целом. Решение удалить переменные происходит по порядку и является окончательным.

Как мы можем доказать, что возраст входит в набор данных?

Мы можем удалить возраст из выпадающего списка, что приведет к [indus, nox, dis, lstat], а затем удалить эти четыре столбца из исходного набора данных. Когда мы повторно запускаем это подмножество переменных, мы ожидаем, что на выходе будет указано «age», если его следует отбросить. Если мы не получаем результата, это означает, что «возраст» должен был остаться в наборе.

Как вы увидите ниже, обе функции не имеют вывода. Возраст должен был остаться.

R

Python

Краткий обзор

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

Итак, какое решение?

  1. Записывать состояния переменных на основе исходной логики
  2. Рассчитайте, какие переменные отбросить в конце, используя журнал
  3. Исходный: исходное решение удаляет столбцы последовательно, немедленно и окончательно.
  1. Пересмотрено: фиксирует состояния переменных без перехода в формат кадра данных.

2. Исправлено: рассчитайте, какие переменные следует исключить, используя res

Ниже приведен вывод res, содержащий состояния переменных вместе с определениями переменных.

v1, v2: анализируемая строка и столбец
v1, v2 [.mean]: средняя корреляция для каждого v1 и v2
corr: попарная корреляция между v1 и v2
drop: исходное решение о понижении (v1.mean, v2.mean)

Пересмотренные (2) этапа расчета падения

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

Шаг 1: all_vars_corr = Все переменные, которые превысили порог корреляции 0,6. Поскольку наша логика будет захватывать переменные, удовлетворяющие этому условию, это будет набор уникальных переменных в столбцах v1 + v2 из приведенной выше таблицы res.

Результат: [«tax», «indus», «lstat», «rm», «zn», «age», «nox», «dis»]

Шаг 2: Poss_drop = Уникальные переменные из выпадающего столбца. Они могут или не могут быть отброшены в конце.

Результат: [‘indus’, ‘lstat’, ‘age’, ‘nox’, ‘dis’]

Шаг 3: не помещайте = переменные из v1 и v2 в Poss_drop. По сути, любые переменные, которые нельзя отбросить, будут сохранены.

Результат: [‘zn’, ‘tax’, ‘rm’]

Шаг 4: drop = Переменные из v1 и v2 появляются в той же строке, что и keep. Если мы знаем, какие переменные сохранить, то любая переменная, связанная с ними, будет удалена.

Результат: [‘lstat’, ‘nox’, ‘dis’, ‘indus’]

Шаг 5: Poss_drop = Удалите переменные перетаскивания из Poss_drop. Мы удаляем переменные, которые, как мы знаем, исключаются из списка возможных.

Результат: [‘age’] - это последняя переменная, которая исключена из возможных.

Шаг 6. Подберите фрейм данных, чтобы он включал только переменные Poss_drop в версиях v1 и v2. Мы хотим узнать, есть ли причина для снижения возраста.

Шаг 7: удалите строки, в которых переменные перетаскивания находятся в v1 или v2, и сохраните уникальные переменные из столбца перетаскивания. Сохраните результат в more_drop. Здесь мы удаляем строки, которые, как мы знаем, содержат отбрасываемые нами переменные. В этом меньшем примере мы получим пустой набор, поскольку все строки содержат переменные, которые, как мы знаем, мы отбрасываем. Это правильный результат: возраст не указан.

Результат: set ()

Шаг 8. Добавьте переменные more_drop для отбрасывания и возврата.

Результат: ['lstat', 'nox', 'dis', 'indus']: more_drop не содержит возраст после ручного выполнения шагов в таблице res это именно то, что мы ожидаем.

Вот вся функция calcDrop ():

Краткий обзор

В этом примере мы продемонстрировали обновленную пару функций для фильтрации переменных на основе корреляции. Функции работают следующим образом:

  1. corrX_new: регистрировать состояния переменных на основе исходной логики.
  2. calcDrop: рассчитайте, какие переменные следует отбросить.

Последний пример

Давайте воспользуемся набором данных (mdrr) из пакета каретки R, который содержит множество взаимосвязанных функций. В этом разделе мы будем использовать старые и новые функции, и он будет менее подробным, поскольку мы рассмотрели общую процедуру тестирования.

R (исходный)

findCorrelation () удаляет 203 столбца

Python (исходный)

corrX_orig () удаляет 203 столбца

Python (пересмотренный)

Выявлено 9 столбцов, которые нельзя было исключать из набора данных. Подтвердим на R и Python.

R

Когда столбцы, идентифицированные python, добавляются обратно в основной набор в R, отбрасывание столбцов не определяется.

Python

Результаты в Python идентичны. Столбцы [«DDI», «ZM1V», «X2v», «piPC05», «VAR», «SPAN», «QYYe», «GMTIV», «X5sol» не должны были изначально удаляться.

Заключение

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

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

Не стесняйтесь обращаться ко мне в LinkedIn.