Время прочтения: 7 мин.

Часто наборы данных, с которыми приходится работать, содержат большое количество признаков, число которых может достигать нескольких сотен и даже тысяч. При построении модели машинного обучения не всегда понятно, какие из признаков действительно для неё важны (т.е. имеют связь с целевой переменной), а какие являются избыточными (или шумовыми). Удаление избыточных признаков позволяет лучше понять данные, а также сократить время настройки и обучения модели, улучшить её точность и облегчить интерпретируемость. Иногда эта задача и вовсе может быть самой значимой, например, нахождение оптимального набора признаков может помочь расшифровать механизмы, лежащие в основе проблемы, представляющей интерес для исследования. Это может быть полезным для разработки различных методик, например, банковского скоринга, поиска фрода или медицинских диагностических тестов. Обычно методы отбора признаков делят на 3 категории: статистические методы или фильтры (filters), встроенные алгоритмы (embedded algorithms) и методы обёртки (wrappers). В настоящем цикле статей приведён обзор некоторых из этих методов с обсуждением их достоинств, недостатков и особенностей реализации.

Статистические методы (фильтры)

Статистические методы применяются до обучения модели и как правило имеют низкую стоимость вычислений. Они основаны на визуальном анализе (например, удаление признака, у которого только одно значение, или большинство значений пропущено), оценке признаков с помощью какого-нибудь статистического критерия (дисперсии, корреляции,  и др.) и экспертной оценке (удаление признаков, которые не подходят по смыслу – например, «цвет галстука заёмщика» в задаче кредитного скоринга 😊).

Простейшим способом оценки пригодности признаков является разведочный анализ данных (например, с библиотекой pandas-profiling). Однако при больших размерах датасета сложность этой процедуры значительно возрастает, поэтому её можно автоматизировать с помощью библиотеки feature-selector, которая отбирает признаки по следующим параметрам:

  1. Количество пропущенных значений (удаляются признаки, у которых процент пропущенных значений больше порогового значения)
  2. Коэффициент корреляции (удаляются признаки, у которых коэффициент корреляции больше порогового значения)
  3. Вариативность (удаляются признаки, состоящие из одного значения)
  4. Оценка важности признаков с помощью lightgbm (удаляются признаки, имеющие низкую важность в модели lightgbm. Следует применять только если модель lightgbm имеет хорошую точность)

Хороший туториал по этой библиотеке находится здесь.

Более сложные методы автоматического отбора признаков реализованы в sklearn. VarianceThreshold отбирает признаки, у которых дисперсия меньше заданного значения. SelectKBest и SelectPercentile оценивают взаимосвязь предикторов с целевой переменной используя статистические методы, позволяя отобрать соответственно заданное количество и долю наилучших признаков. Методы отбора основаны на F-тестах (обозначаются f_regression и f_classif соответственно для регрессии и классификации), оценке функции взаимной информации (mutual_info_regression и mutual_info_classif) и  (chi2 для классификации). F-тесты хорошо работают только с линейными зависимостями, поэтому лучше всего они подойдут для линейной регрессии, а — тесты требуют неотрицательных и правильно отмасштабированных признаков. Поэтому удобнее всего использовать методы, основанные на вычислении взаимной информации – они почти не требуют настройки и позволяют находить нелинейные связи.

Рассмотрим применение статистических методов в реальной задаче – предсказать, зарабатывает ли человек больше $50 тыс. Загрузим библиотеки и данные, для удобства оставив только численные признаки:

  • age – возраст,
  • fnlwgt (final weight) – примерная оценка количества людей, которое представляет каждая строка данных,
  • educational-num – длительность обучения,
  • capital-gain – прирост капитала,
  • capital-loss – потеря капитала,
  • hours-per-week – количество рабочих часов в неделю.

Посмотрим на данные:

В качестве модели будем использовать случайный лес. Посмотрим точность на кросс-валидации:

И на важность признаков в модели:

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

Создадим 12 «шумовых» признаков, элементами которых будут не коррелируемые случайные числа из выборок с нормальным и равномерным распределениями. Параметры каждого распределения подбираются случайным образом независимо друг от друга.

Проведём кросс-валидацию на наших зашумлённых данных и посмотрим на важность признаков:

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

Проведём отбор признаков статистическими методами, для чего будем использовать обобщённый вариант SelectKBest и SelectPercentile, который называется GenericUnivariateSelect. Он принимает на вход 3 параметра – функцию оценки, режим отбора и его параметры. В качестве функции оценки будем использовать метод, основанный на вычислении взаимной информации.

Сгенерированные нами признаки имеют низкое значение оценочной функции (scores_), поэтому в дальнейшем селектор не будет их использовать (get_support()=False).

В реальной задаче (когда количество шумовых признаков неизвестно) параметры GenericUnivariateSelect можно находить на кросс-валидации вместе с другими гиперпараметрами модели. Посмотрим, как изменится точность нашей модели после подбора параметров регуляризации случайного леса и количества признаков селектора:

Средняя точность на кросс-валидации значительно выросла, а лучший результат получился всего для 5 признаков. Посмотрим на них:

Таким образом лучший результат был получен после удаления шумовых признаков и признака fnlwgt, который при первоначальной оценке был самым значимым для модели. Однако из всех оригинальных признаков он имел наименьшее значение оценочной функции в GenericUnivariateSelect. Результаты оценки важности признаков после отбора имеют более логичную интерпретацию – на заработок человека влияют именно характеристики человека, а не параметры самой выборки. Таким образом статистический отбор признаков бывает полезен для увеличения точности модели и получения менее смещённой оценки для интерпретации её результатов.

Заключение

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