Как организовать детекцию аномалий по метрикам модели
Что проверяют
Умеете ли вы построить мониторинг модели, который ловит реальные проблемы и не заваливает команду ложными алертами. Следом обычно спрашивают, что делать, если разметка приходит с опозданием в несколько недель и качество напрямую не посчитать.
Как отвечать
Разделите метрики на три слоя, у каждого своя детекция:
- технические: задержка p95 и p99, доля ошибок, пропускная способность. Здесь хватает порогов по SLO в Prometheus и Alertmanager с дашбордами в Grafana;
- входные данные и предсказания: доля пропусков по признакам, распределения признаков и скоров, доля положительного класса. Дрейф меряют через PSI, тест Колмогорова-Смирнова или расстояние Йенсена-Шеннона, считать удобно в Evidently;
- качество: ROC AUC, precision и recall, бизнес-метрика, когда появляется разметка. При задержанной разметке это запаздывающий сигнал, поэтому ранним индикатором служит дрейф предсказаний.
Методы детекции от простого к сложному: статический порог; скользящее окно с робастным z-score на медиане и MAD, чтобы выбросы не сдвигали базу; разложение ряда на тренд и сезонность (STL) с поиском аномалий в остатке; прогноз с доверительным интервалом. Isolation Forest уместен, когда нужно смотреть на десятки метрик сразу, но объяснять его алерты сложнее.
Отдельно продумайте устройство алертов: срабатывание после двух или трёх плохих окон подряд, приоритеты, ответственный и понятный runbook. Детектор проверяют на истории: прогоняют по прошлому году и смотрят, какие известные инциденты он поймал и сколько ложных тревог дал.
Где спотыкаются
Ставят фиксированный порог на метрику с недельной сезонностью. Каждые выходные приходит алерт, и через месяц их перестают читать.
Смотрят только на общий агрегат. Падение качества в одном сегменте, например на новой платформе, растворяется в среднем, поэтому метрики режут по ключевым срезам с учётом размера выборки.
Путают дрейф данных с деградацией модели. Сдвиг распределения признака не всегда портит предсказания, а концептуальный дрейф может случиться при неизменных входах.