Как отобрать 10 тысяч признаков для модели?
Что проверяют
Умеете ли вы строить отбор как конвейер: от дешёвых фильтров к дорогим модельным методам, с защитой от утечки и переобучения на самом отборе. Следом спрашивают, как убедиться, что отобранный набор не случайный, и сколько признаков оставлять.
Как отвечать
На 10 тысячах кандидатов переборные методы не работают, поэтому идёте воронкой:
- чистка: константы и почти константы (
VarianceThreshold), доля пропусков, точные дубли колонок; - утечки и доступность: признак подозрительно хорош или считается по данным, которых нет в момент прогноза. Проверьте, что каждый признак реально доступен в проде с нужной задержкой;
- стабильность: PSI по периодам и adversarial validation, то есть классификатор, отличающий старые данные от новых. Признаки, на которые он опирается, дрейфуют;
- корреляции: кластеризуете сильно коррелированные признаки и оставляете по одному представителю из группы;
- одномерные фильтры:
mutual_info_classif, в кредитном скоринге IV. Быстро, но взаимодействий не видит; - модельные методы: LightGBM или CatBoost на оставшемся, отбор по gain и permutation importance на валидации, SHAP. Для линейных моделей L1-регуляризация через
SelectFromModel.RFEсstep=0.1убирает за итерацию 10% от исходного числа признаков, это ещё терпимо по времени. Boruta сравнивает каждый признак с перемешанными копиями и отсекает те, что не лучше шума.
Число признаков выбирайте по кривой качества на кросс-валидации: где метрика перестаёт расти, там и остановка. Учтите стоимость: каждый признак в проде это расчёт, хранение и мониторинг.
Где спотыкаются
Отбирают признаки на всём датасете до разбиения. Отбор подглядел в валидацию, и метрика завышена; отбирать нужно внутри каждого фолда, например в Pipeline.
Выбрасывают признаки по важности из одного прогона. Порядок заметно меняется между фолдами и запусками с разным seed, надёжнее оставлять то, что стабильно попадает в топ.
Предлагают последовательное добавление признаков по одному. На 10 тысячах это до 10 тысяч обучений на каждом шаге. А p-значения от тысяч одномерных тестов без поправки на множественные сравнения дадут сотни ложных находок.