Получите ту же производительность модели даже после отказа от 93 функций

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

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

Идея рекурсивного исключения функций

Рассмотрим это подмножество набора данных Ansur Male:

Он регистрирует более 100 различных типов измерений тела более 6000 военнослужащих армии США. Наша цель - предсказать вес в фунтах, используя как можно меньше функций. (В наборе данных 93 числовых объекта)

Давайте установим базовую производительность с помощью Random Forest Regressor. Сначала мы создадим массивы функций и целевых массивов и разделим их на обучающие и тестовые наборы. Затем мы подберем оценщик и оценим его производительность с помощью R-квадрата:

Мы получили отличный R-квадрат 0,948. Мы могли бы сделать это, используя все 98 функций, а это намного больше, чем нам может понадобиться. Все оценщики Sklearn имеют специальные атрибуты, которые показывают веса характеристик (или коэффициенты), заданные как coef_ или .feature_importances_. Давайте посмотрим на вычисленные коэффициенты для нашей модели случайного регрессора леса:

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

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

Класс исключения рекурсивных функций Sklearn

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

Ниже вы увидите пример RFE, использующего вышеупомянутую модель случайного регрессора леса:

После подбора оценщика у него есть атрибут .support_, который дает логическую маску со значениями False для отброшенных объектов. Мы можем использовать его для подмножества наших данных:

X_train.loc[:, rfe.support_]

Или вы можете напрямую вызвать .transform(), чтобы получить новый массив numpy с соответствующими функциями. Давайте воспользуемся этим меньшим подмножеством, чтобы еще раз протестировать Random Forest Regressor:

Даже после того, как мы отказались от почти 90 функций, мы получили тот же результат, что очень впечатляет!

Рекомендации по производительности RFE

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

Выбор количества функций для автоматического сохранения

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

Для этого Sklearn предоставляет аналогичный класс RFECV, который реализует рекурсивное исключение функций с перекрестной проверкой и автоматически находит оптимальное количество функций, которые необходимо сохранить. Ниже приведен пример использования RFECV для простой линейной регрессии. Мы выберем линейную регрессию, потому что можем предположить, что между измерениями тела будет линейная корреляция. Кроме того, в сочетании с перекрестной проверкой Random Forest Regressor станет более затратным в вычислительном отношении:

Я предоставил значения по умолчанию для параметров cv и scoring. Новый гиперпараметр - min_features_to_select - вы, наверное, догадались, что он делает, по названию. Давайте посмотрим, сколько функций рассчитал сохранить оценщик:

RFECV говорит нам оставить только 5 из 98. Давайте обучим модель только этим 5 и посмотрим на ее производительность:

Даже после отказа от 93 функций мы получили впечатляющую оценку 0,956.

Резюме

Прочитав это руководство, вы узнали:

  • идея, лежащая в основе исключения рекурсивных функций
  • как использовать реализацию алгоритма с использованием класса Sklearn RFE
  • как определить количество функций, которые будут автоматически сохраняться с использованием класса RFECV

Если вы хотите более детально изучить алгоритм, вы можете прочитать этот пост.

Дополнительная литература по выбору функций:

Вам также может быть интересно: