Подготовка данных для создания предсказательных моделей: обнаружение и удаление "ненужных" предикторов
Стадия подготовки исходных данных играет очень важную роль в процессе создании эффективных предсказательных моделей. Следующие сообщения будут посвящены основным процедурам, используемым на этой стадии. Начнем с обнаружения и удаления "ненужных" предикторов (признаков).
- Меньшее количество переменных может привести к значительному ускорению вычислений.
- Наличие нескольких высоко коррелирующих друг с другом предикторов может привести к созданию неустойчивых решений или вообще сделать вычисления невозможными (например, при использовании таких классических методов, как линейная регрессия или логистическая регрессия; подробнее о проблеме мультиколлинеарности см. здесь). Кроме того, включение в модель нескольких высоко коррелирующих друг с другом предикторов часто не имеет смысла, поскольку, по сути, они несут в себе одинаковую информацию. Соответственно, удаление некоторых из таких предикторов не приведет к заметному снижению качества модели.
- Некоторые алгоритмы могут быть чувствительными также к наличию предикторов, которые не несут в себе никакой или почти никакой информации. С математической точки зрения, такие переменные характеризуются очень низкой дисперсией.
Предикторы с околонулевой дисперсией
Предположим, что мы имеем дело с экстремальным случаем, когда некоторый предиктор представлен только одним уникальным значением (например, у всех клиентов банка значения этой переменной равны 1). При таком сценарии дисперсия предиктора равна нулю и он бесполезен для предсказания интересующего нас отклика. В других случаях дисперсия может быть отличной от 0, но все же недостаточно высокой для того, чтобы сделать соответствующий предиктор полезным для предсказания отклика. Подобные переменные с околонулевой дисперсией ("near-zero variance") рекомендуется удалять из дальнейшего анализа (Kuhn & Johnson 2013).
Но как обнаружить такие предикторы? Одним из их отличительных свойств является низкая доля уникальных значений по сравнению с общим числом наблюдений. Рассмотрим простой пример количественной переменной, обладающей этим свойством:
Как видим, 55 наблюдений, входящих в вектор x , представлены только тремя уникальными значениями, доля которых составляет лишь 5.5% от общего числа наблюдений.
Однако только низкой доли уникальных значений недостаточно. Так, многие (но не все!) индикаторные переменные, представленные только двумя значениями (0 и 1), подпадали бы под это условие. Важной является не только низкая доля уникальных значений, но еще и относительная частота этих значений. В частности, Kuhn & Johnson (2013) рекомендуют рассчитывать отношение частоты наиболее часто встречающегося значения к частоте второго по встречаемости значения - высокое отношение будет указывать на явный дисбаланс в частотах уникальных значений (и. как следствие, на низкую дисперсию):
- Доля его уникальных значений от общего числа наблюдений составляет не более 10%;
- Отношение частот первых двух наиболее обычных его значений превышает 20.
Функция nearZeroVar() имеет несколько управляющих аргументов, включая uniqueCut и freqCut , позволяющих изменять принятые по умолчанию пороговые величины доли уникальных значений и отношения частот первых двух наиболее обычных значений соответственно. Кроме того, при помощи аргументов foreach и allowParallel вычисления, выполняемые nearZeroVar() , можно запустить одновременно в несколько потоков, что увеличит скорость этих вычислений (актуально при работе с большими объемами данных).
Обнаружение сильно коррелирующих предикторов при небольшом их количестве не составляет особого труда - для этого достаточно воспользоваться базовой функцией cor() и рассчитать корреляционную матрицу. Однако при большом числе предикторов визуальное исследование такой матрицы становится почти невозможным, что требует использования других подходов. Одним из удобных средств визуализации корреляционных отношений между переменными в таких случаях является использование "тепловых карт" (heat maps), ячейки которых залиты цветом в соответствии с уровнем корреляции. Более того, для выявления групп высоко коррелирующих переменных ячейки на таких диаграммах часто упорядочивают в соответствии с результатами параллельно выполняемого кластерного анализа. Построить такую диаграмму в R можно при помощи нескольких функций. Удобной, в частности, является функция corrplot() из одноименного пакета (эта функция имеет большое количество параметров, позволяющих выполнять тонкую настройку внешнего вида диаграммы - подробнее см. ?corrplot ):
Чем интенсивнее цвет заливки квадрата в каждой ячейке приведенной тепловой карты и чем больше размер этого квадрата, тем выше (по модулю) корреляция между соответствующими переменными. Можно заметить небольшие группы коррелирующих друг с другом переменных (например, группа переменных, чьи имена начинаются с " CheckingAccountStatus ").
В состав пакета caret входит функция findCorrelation() , которая, как следует из ее названия, находит предикторы, чей уровень корреляции с другими предикторами в среднем превышает некоторый заданный пользователем порог (аргумент cutoff ):
Обратите внимание, что использование рассмотренных выше подходов для обработки исходных данных, т.е. удаление предикторов с околонулевой дисперсией и высоко коррелирующих предикторов, не является обязательным. Для некоторых алгоритмов создания предсказательных моделей наличие таких предикторов не обязательно представляет проблему (например, деревья принятия решений не чувствительны к признакам с околонулевой дисперсией). Кроме того, проблему мультиколлинеарности можно преодолеть при помощи метода главных компонент. Необходимость удаления тех или иных предикторов из исходных данных определяется несколькими факторами, такими как общее количество имеющихся предикторов, планируемые к использованию алгоритмы построения моделей, количество "проблемных" переменных, имеющиеся вычислительные мощности и др.