Про анализ важности фичей
В очередной модели, которую попросили «посмотреть», обнаружил сразу три графика по важности фичей в бустинге:
— По числу сплитов по фиче (дефолтный feature_importances_)
— По gain
— По tree shap
Пропустим пока вопрос о дрифте фич (а они бывают разные с разными эффектами) — про них отдельно стоит написать.
Дальше я наивно ждал интерпретации — но увы.
Когда я об этом спросил услышал две версии от двух тимлидов:
Астерикс— «где gain выше та фича и сильнее»,
Обеликс — «где shap выше та фича и сильнее».
Поскольку галлы строят модели под влиянием волшебного друидского зелья и не знакомы с латинским, немного навайбкодил примеров чтобы показать что для анализа фичей нужны все три важности (это еще не считая анализа стабильности этой важности во времени / по фолдам).
Ключевое в них — кросс-плоты feature_importance по cплитам vs по gain и по shap vs по gain.
Это два графика, которые нужно обязательно смотреть в бустингах.
Если вкратце:
1. Важность по gain сильно завышает редкие бинарные фичи с резким эффектом (в тетрадке это x_strong_rare). Модель редко использует их (малый SHAP), но когда использует — один сплит даёт огромный выигрыш.
Что с такими фичами делать?
Если они сами по себе интерпретируемы и срабатывают редко —
их нужно выносить в сигналы до модели!
Иначе будут проблемы и с обучением (понадобится больше деревьев и стабильность пострадает) и с интерпретируемостью — такая фича забьет рабочие лошадки по важности + начнет ломать интерпретируемость shap (либо придется считать отдельно для x_strong_rare = 1 или x_strong_rare = 0).
Смотрят либо фичи вылетевшие вверх на графике shap vs gain либо проверяют фичи которые в топе по gain но не в топе по shap.
Бонусом к отдельному сигналу — частота у такой фичи может сильно скакать во времени что еще больше нарушит стабильность модели.
Так что вынос такой фичи в отдельный сигнал — это еще и интерпретабельность PSI модели.
Как это повлияет на калибровку?
Ухудшит “глобальную” калибровку, но улучшает там, где модель реально работает (при x_strong_rare = 0).
2. Есть фичи вроде x_weak_often — с высоким сплитом, но низким shap и gain.
Здесь может быть несколько вариантов:
— +/- симметрично распределенный непрерывный шум
— фича костыль: есть небольшая коррекции с таргетом, но в модель ничего не добавляет
— фича по построения состоит из нескольких бакетов
В любом случае если зажали max_depth / n_estimators чтобы «регуляризоваться» то модель потратит кучу деревьев и сплитов на такие шумные и удобные для сплита фичи вместо того чтобы поймать реальный сигнал.
Еще она может массировать другие проблемы вроде мультиколлинеарности или ликов.
Не выбросить такую фичу — ошибка!
Как еще их можно отловить?
Строить feature_importance по месяцам/фолдам и проверять стабильность важности фичи.
Следить за дисперсией метрики (ex: Gini) на CV.
3. Есть фичи с низким split и не самым высоким gain, но с высоким SHAP.
То есть модель редко по ним сплитится, но почти в каждом объекте они двигают prediction.
Выбрасывать такие фичи — тоже ошибка!
Итого:
1. Строим:
- split vs gain
- shap vs gain
2. Если фича:
- top gain, но не top shap → кандидат в сигнал
- top split, но низко по shap и gain → кандидат на выброс
- low split, not high gain, high shap → не трогать, это рабочая фича (пока мы не исследовали ее стабильность по времени)
3. Проверяем:
- стабильность importance по фолдам / времени
- Дисперсию метрики по фолдам кросс-валидации
- PSI условно (x_strong_rare=0)
4. Только после этого:
- feature selection
- регуляризация
Те кто внезапно дочитал до этого момента могут заключить что второй тимлид был прав и надо смотреть только на shap.
Но
высокий shap ничего не гарантирует!
.
Особенно, если:
⁃ Он высокий только на трейне
⁃ Нестабилен по фолдам / или времени
⁃ Фича сама по себе нестабильна
⁃ Модель деградирует на OOT
PS.
низкий SHAP не значит что фича плохая.
Например:
— фича-разделитель (регион),
— стабилизирует модель,
— работает только в хвостах,
часто имеют низкий SHAP, но без них качество и стабильность падают.
