Привет, Хабр! Меня зовут Зотов Глеб, я ML-инженер в команде скоринга в билайне. В статье расскажу о том, как не сойти с ума, мониторя десятки графиков вручную.
Скоринговая модель может быть блестящей на этапе обучения, показывать отличные значения всех метрик на кросс-валидации и радовать бизнес на первых неделях после деплоя. Но вжух — и через два месяца валидационные метрики поползли вниз, отклонения по PSI зашкаливают, а product owner уже поглядывает в твою сторону с подозрением.
Проблема? Проблема.
Давайте разберемся, почему так происходит и как можно этого избежать.
Проблематика: понять, когда модель «устала»
«Вчера было нормально» — это классическая проблема при построении модели, которая работает с динамически изменяющимися признаками. Стабильные на обучении фичи внезапно начинают вести себя иначе на out-of-sample или даже в проде.
В чем же причина деградации перфоманса модели?
Ответ довольно прост — данные меняются:
Feature drift — изменение распределения признаков.
Concept drift — поведение таргета изменилось, и прежние закономерности больше не работают.

Пожалуй, каждый, кто работал со скоринговыми моделями, хоть раз сталкивался с PSI (Population Stability Index). Именно её чаще всего используют как первый индикатор, что в модели что-то пошло не так: изменилось распределение признака, сместился скор или же просто пользователи стали другими.
Но одного PSI зачастую бывает недостаточно. Поэтому нужен набор мониторинговых метрик стабильности, где у каждой своя зона ответственности. Ниже — метрики, которые используем мы:
Population Stability Index
Сравнивает гистограммы двух выборок, в нашем случае —- обучающей и продовой, и оценивает, насколько изменилось распределение. Простая, легко интерпретируемая метрика.KS (Kolmogorov–Smirnov Statistic)
Измеряет максимальное расстояние между кумулятивными распределениями. Хорошо показывает резкие смещения, но чувствительна к скачкам в хвостах.KL Divergence (Kullback–Leibler Divergence)
Мера «информационной дистанции» между двумя распределениями. Неустойчива к выбросам и нулям, требует сглаживания.JH Divergence (Jensen–Shannon Divergence)
Симметричная и сглаженная версия KL.Wasserstein Distance (aka. Earth Mover’s Distance)
Расстояние между формой двух распределений. Очень чувствительная метрика, полезна при улавливании минимальных сдвигов.
Такой комплексный пул метрик помогает мониторить стабильность в распределении параметров. Но важно понимать, даже при стабильных признака качество модели может деградировать. А это значит, что нам нужны другие метрики.
Чтобы отслеживать качество модели используется классические метрики в зависимости от типа задачи:
Классификация — Gini, F1, ROC AUC.
Регрессия — MAE, MSE, RMSE, MAPE.
Отдельно хочется отметить вопрос переоценки или недооценки вероятности в задачах классификации. Модель может отлично ранжировать, но давать систематически завышенные или заниженные вероятности. Для некоторых таргетов это довольно критично.
Для оценки качества калибровки используются график Calibration curve и метрика ошибки ECE (Expected Calibration Error), которая агрегирует это отклонение в одно число.

Когда нужно комбинированное применение метрик
Предположим, что данные разбиты по временным партициям (периодам), например, квартал, месяц или неделя. Мы фиксируем эталонный период — обычно это первый доступный в выборке, если в нем достаточное количество наблюдений и нет выбросов.
Далее считаем сами метрики стабильности по каждой новой партиции относительно эталона. В результате получаем временные ряды метрик стабильности, по которым мы можем отслеживать динамику стабильности фичи или же самой модели.


Теперь мы можем отследить динамику: тренды, выбросы, сезонность. Все это упрощает мониторинг стабильности, но есть одно «но».
Количество признаков, которые используются в модели, и количество метрик стабильности в совокупности плодят огромное количество графиков, которые практически невозможно мониторить вручную и сохранить здравый смысл.
Фича A: PSI растет → «плохо»
Фича B: PSI падает → «нормально»
Фича C: колебания вокруг 0.05 → «наверное, это шум? или есть какая-то сезонность?»
Фича D: «это выброс или нет?»
...
Фича N: «это шумит в голове или на графике?»
А таких признаков — сотни.

Так и появляется идея об автоматизации оценки этих графиков.
Что мы хотим получить? Автоматическую систему, которая умеет смотреть на временные ряды метрик так же, как мы, но быстрее, объективнее и без кофеина.
Идеально, чтобы система сама оценивала поведение временного ряда и отдавала на выходе единственное число — оценку для данного графика. Это поможет:
Находить фичи с подозрительной динамикой, которые требуют ручного контроля и проверки.
Ранжировать графики между собой. Это может быть полезно, когда мы выбираем наиболее стабильную модель среди тех, у кого близкие метрики качества.
Ускорить процесс feature selection, заранее исключая все нестабильные признаки (те, у которых низкие оценки).
Подход к реализации
Общая задумка выглядела так:

Но пойдем по порядку.
Формирование выборки
Для начала мы собрали выборку метрик на разных моделях и исторических периодах. И... начали ручную разметку временных рядов — лучше сделать это хорошо один раз, чем возвращаться к этому постоянно.
Мы ориентировались на два типа оценок:
Оценка 0 или 1, которая влияла на то, можно ли считать данный ряд стабильным и пропустить такую фичу в модель.
Оценка для задачи регрессии от 1 до 5, чтобы можно было получить регрессионную оценку графиков и отранжировать их между собой.
При разметке мы обращали внимание на общий тренд графика, колебания и волатильность, скачки и выбросы. А для метрик стабильности — на пороговые значения.

Но иногда встречаются спорные моменты, которые даже при наличии двойной оценки не удается однозначно разметить. Наличие таких примеров подтверждает необходимость автоматизации оценки, каждый раз останавливаться при оценке таких графиках вручную очень затратно по времени.

Для каждой из метрик мы делали разметку, учитывая «особенности» самого ряда. Например, для графика PSI выброс вверх — плохо, для графика Gini — ровно наоборот. Более того, метрики Precision Macro и Calibration Curve требовали отдельного подхода, так как не привязаны под временные партиции, но о них чуть позже.
Генерация признаков временных рядов
Идея проста: если метрика — это временной ряд, то с ней можно (и нужно) обращаться как с временным рядом и извлекать из нее признаки.
Чтобы определить, насколько стабилен ряд, нами были подобраны соответствующие параметры:
Стационарность и тренды (например Augmented Dickey–Fuller test).
Линия регрессии по точкам ряда.
Статистические параметры (отклонения, выбросы).
Дополнительные признаки (индикаторы тренда, минимумы и максимумы ряда)
Одной из интересных идей было использование «golden cross» — популярного индикатора в техническом анализе. Он указывает точку, в которой короткая Moving Average пересекает длинную.

Источник 1: https://i.ytimg.com/vi/O2_fNpAZvNg/maxresdefault.jpg
Источник 2: https://www.youtube.com/watch?v=O2_fNpAZvNg
В процессе исследования было сгенерировано достаточно много параметров, которые были по разному полезны для рядов разных метрик.
Обучение моделей-оценщиков
Для каждой метрики мы обучали по две отдельные модели:
Классификатор, для таргета стабильности — 0 или 1.
Регрессионную модель для таргета оценки — от 1 до 5 (все верно, оценка для оценки).
Использование сразу двух моделей помогает купировать кейсы, где нельзя однозначно сказать, стабилен ли ряд или нет, но можно оценить его поведение более общей оценкой. Или же наоборот, довольно просто понять общую картину, график на троечку…, но тяжело определить, насколько он стабилен.
Также, как выяснилось эмпирически, зависимости между признаками и таргетами (бинарным и дискретным), разнятся, поэтому подход с двумя моделями был оправдан.
Модели были линейные и проходили полный этап классического машинного обучения:
Feature Selection.
Кросс-валидация для отбора гиперпараметров.
Калибровка (если требовалось).
Валидация на Out-of-Sample.
Метрики были тоже без экзотики: F1 и ROC-AUC для классификатора, MAE и RMSE для регрессии.
Аргументы в пользу простых моделей были вполне очевидны: таргет и признаки довольно просты, и их зависимость должна хорошо обосновываться линейно. Модели должны быть быстрыми, так как придется оценивать достаточно много графиков.
Итоговый скор формировался взвешенной комбинацией оценок двух моделей. Сами веса также варьировались от метрики к метрике и подбирались на валидационной выборке, максимизируя MAE оценку.
Спецобработка Precision-macro и Calibration
Несколько метрик, которые завязаны на ранжирование или калибровку, требуют отдельной логики.
Например, для оценки Precision Macro нам вовсе не нужен ML. График строится по пороговым значениям, где по оси X — пороговое значение от 0 до 1, а по оси Y — значение Precision (или же Precision Macro, если категорий больше двух).
Идеальное ранжирование — это монотонно растущий график. Чем выше порог отсечения, тем выше точность предсказаний. И наоборот, просадка в каком-то пороге сигнализирует о проблеме в ранжировании.
Становится понятно, что идеальное ранжирование — это монотонно растущий график. В связи с этим можно получить оценку для такой метрики, используя экспоненциально взвешенную оценку монотонности от бина к бину.
Экспоненциальный вес поможет придать больший штраф за просадку в крайних пороговых значениях, что важно при работе со скоринговыми моделями.

Применение и интеграция автоматизации в процесс построения моделей
Теперь поговорим о главном — как и где можно применить такую автоматизацию.
Можно выделить две основные ветви:
применение в мониторинге фичей и их оценке;
использование при построении модели как оптимизационной метрики стабильности.
В первом случае мы можем настроить наш мониторинг таким образом, чтобы он подсвечивал признаки, у которых оценка уходит за критическое значение. Это поможет в практически автоматическом режиме отлавливать уехавшие признаки и своевременно убирать их из работы.
Во втором случае открывается большое пространство для творчества.
Когда мы можем использовать динамическую оценку стабильности:
на этапе отбора признаков.
при подборе гиперпараметров модели.
при ранжировании похожих по качеству моделей между собой.
Более того, после построения модели, которая соответствует метрикам качества, мы можем ее «дотюнить» еще одним этапом отбора фичей и/или гиперпараметров, чтобы получить стабильный и качественный результат.
Не все так просто
Безусловно, остается ряд проблем, которые нужно решить.
Очевидно, что модели-оценщики не идеально справляются со своей работой, и существует определенная доля ошибки. Где-то это связано с человеческим фактором при разметке выборки, а где-то это недостаточная обобщающая способность сгенерированных признаков. Тем не менее мы берем на себя риск этой погрешности, так как выгода от автоматической оптимизации стабильности перекрывает стоимость этих ошибок.
Еще одним сюрпризом стало желание модели сильно «переобучаться» в стабильность. Если заиграться с оптимизацией, то можно сильно урезать качество модели, в попытках выправить график PSI.
Этого можно избежать, если добавить дополнительную логику «идеального баланса» между качеством и стабильностью, но об этом поговорим в другой раз.

В следующей статье мы расскажем про то, как смогли применить этот подход на практике в решении продуктовых задач. Поговорим про сложности, с которыми столкнулись, а также оценим, сколько удалось сохранить времени путем такого метода оптимизации, и пришлось ли для этого жертвовать качеством.