Как известно, некоторые признаки, характеризующие объекты в моделях машинного обучения могут оказаться фиктивными или избыточными. Соответственно, их включение в пайплайн может привести к снижению качества прогнозов. Рассмотрим, один из популярных способов оптимизации набора признаков, который заключается в формировании их множества путем последовательного добавления по одному наиболее эффективному.
То есть сначала работа модели тестируется на каждом отдельном признаке и выбирается максимизирующий выбранную оценку, затем добавляется еще один, такой что на паре модель дает лучшую оценку и так далее до достижения заданного количества признаков. Существует схожий алгоритм, но действующий в обратном порядке - когда из множества всех признаков убирается по одному, от потери которого качество меньше всего "пострадает".
Оба алгоритма реализованы в классе SequentialFeatureSelector модуля sklearn.feature_selection. Рассмотрим его работу на примере следующего датафрейма:
Разделим данные на выборки:
А теперь сформируем пайплайн нашей модели (подробнее читай здесь):
Попытка запустить SequentialFeatureSelector с нашим пайплайном приведет к ошибке. Обнаружилось, что класс SequentialFeatureSelector не корректно работает с ColumnTransformer, поэтому первый шаг заменим на собственную обработку и пересоздадим объект model:
Теперь обучим SequentialFeatureSelector:
В конструктор класса передаем объект модели, количество оптимальных признаков (n_features_to_select) и итераций в кросс-валидации (cv), метрику (scoring), направление (direction, определяет будет происходить добавление или удаление признаков), количество потоков обработки.
Метод get_support возвращает маску выбранных признаков, где True соответствует попавшим в итоговое множество::
Теперь можно запустить пайплайн на отобранных признаках:
Качество снизилось, так как мы не знаем, какое оптимальное количество признаков нужно модели. Соответственно, найти его можно путем перебора в цикле, но следует иметь в виду, что количество рассматриваемых моделей велико, и это может привести к большим временным затратам (на каждой итерации строится k*num моделей, где k - число итераций перекрестной проверки и num - число оставшихся признаков):
...
Теперь оставим оптимальное количество признаков и оценим модель: