Привет! На связи Мария Жарова, ментор курсов «ML-инженер» и «Дата-сайентист» 👋🏻
Хочу поделиться кейсом, который хорошо показывает, как «безобидный» признак может неожиданно повлиять на модель.
Мы решали задачу предсказания оттока пользователей. Классическая история: табличные данные, градиентный бустинг, аккуратный пайплайн, валидация — всё как надо. На кросс-валидации модель давала стабильный прирост к бейзлайну, метрики выглядели уверенно.
Перед выкаткой решили добавить ещё одну фичу — «время последнего действия пользователя». На первый взгляд, абсолютно логичный и даже полезный признак. После добавления метрика на валидации ещё немного подросла — казалось бы, идеальный кандидат в прод.
Но через несколько дней после выкатки метрики в проде поползли вниз… Сначала думали на данные, потом на инфраструктуру, потом на сдвиг распределений — но оказалось, дело в одной фиче! Как раз «время последнего действия» в обучении считалось относительно фиксированной даты (условно, «срез данных на момент выгрузки»). А в проде — относительно текущего времени.
Звучит безобидно, но по факту:
➖ в обучении модель видела, что«“клиент давно не заходил» — это, например, 30 дней;
➖ в проде это же значение могло стать 60, 90 и т. д., потому что время идёт, а логика пересчёта не была синхронизирована.
В результате распределение признака в проде уплыло относительно train, и модель начала получать значения, которых «не видела» на обучении — поэтому предсказания поехали.
Более того, этот признак оказался одним из самых важных — модель сильно на него опиралась, и даже небольшая логическая несостыковка дала ощутимый эффект.
Поэтому всегда имейте в виду:
😶 Любая фича, завязанная на время — почти всегда источник проблем, если не продумана логика её расчёта в проде;
😶 Важно проверять не только код обучения, но и код генерации признаков для прода — они должны быть идентичны по смыслу;
😶 Полезно смотреть на распределения признаков: train vs prod, хотя бы на базовом уровне;
😶 Если фича становится топ-важной — к ней должно быть повышенное внимание, потому что именно она может «уронить» модель.
И да, чаще всего модель ломает не сложная математика, а такие вот мелочи, которые сначала кажутся очевидными.
Сохраняйте, чтобы не наступить на те же грабли!
