Всем привет! Меня зовут Максим, и в Ситимобил я занимаюсь машинным обучением. Сегодня я расскажу вам, как мы разрабатываем устойчивые ML-модели в суровых условиях изменчивого мира.
![](https://habrastorage.org/getpro/habr/upload_files/f43/da4/81b/f43da481b656bf6942fff0c0ee9990d0.png)
Зачем моделям нужен жизненный цикл
Будем называть ML-моделью объект, возвращающий прогноз для входящего набора признаков. Пусть для простоты это будет модель бинарной классификации.
Представим, что модель уже разработана, метрика на out of time выборке (отложенной во времени) нас устраивает, и мы выкатываем модель в production. Получаем положительный результат в первый месяц работы, но потом качество сильно падает. Сколько нужно ждать, прежде чем предпринимать какие-либо действия в отношении модели? Стоит ли сразу же пытаться актуализировать её или же подождать, так как через день-два метрики снова станут стабильными? В идеальном мире ответ должен быть до развёртывания в production. И жизненный цикл поможет нам ответить на этот и другие вопросы по работе модели.
![](https://habrastorage.org/getpro/habr/upload_files/f69/355/652/f6935565214b4a0ee089e2281f0f014f.jpeg)
Когда вы начнёте искать информацию по планированию жизненного цикла модели, в большинстве случаев найдёте статьи по поддержке существующего алгоритма переобучения средствами DevOps и MLOps. Но как сделать алгоритм, который нужно поддерживать, переобучать и валидировать?
Принципы разработки жизненного цикла модели
Чтобы модель стабильно работала в будущем, нужно на этапе разработки эмулировать её работу на достаточно большом наборе данных. На каждой итерации можно менять один или несколько параметров. Этот процесс напоминает классический подбор гиперпараметров, поэтому нам нужно точно оценивать результат каждой отдельной симуляции по целевой метрике. Только в нашем случае гиперпараметры не типизированы и мы сами решаем, что именно менять в каждой конфигурации.
![](https://habrastorage.org/getpro/habr/upload_files/95c/398/e47/95c398e4702e6d8f045f1c1b90e0cdec.jpeg)
Какие параметры нужно учитывать, чтобы оценить жизненный цикл:
периодичность переобучения модели;
необходимый объём обучающей выборки;
поведение целевой метрики во времени в стабильных и экстремальных условиях;
как учитывать различные смещения целевой переменной и модельных признаков;
прочие вопросы, характерные для отрасли применения модели.
Рассмотрим отдельно каждый из этих пунктов.
Периодичность переобучения модели
Так как мир не стоит на месте и всё постоянно меняется, модель может устаревать и терять качество (в единицах целевой метрики). Поэтому нужно проверить, через сколько часов, дней, месяцев качество начинает ухудшаться. Для этого мы проводим симуляцию, в которой движемся скользящим окном по всем доступным датам и оцениваем модель на несколько интервалов вперед.
![](https://habrastorage.org/getpro/habr/upload_files/4a1/0c7/959/4a10c7959abe0483f73be43a30f2b3ee.gif)
Так мы сможем оценить потенциальное ухудшение качества модели во времени и принять решение о частоте её переобучения.
Оценка объема обучающей выборки
По аналогии с изменением объёма тестовых данных мы можем менять объём обучающей выборки. Мотивация может быть разная:
на небольшом промежутке времени на обучающей выборке модель может переобучиться;
в распределении целевой переменной есть сезонность;
модель вносит смещение в распределение целевой переменной;
объёма данных может быть недостаточно для выявления ключевых зависимостей.
Чтобы понять, сколько данных нам достаточно для стабильной работы модели, нужно также пройтись скользящим окном по доступным датам, но уже в обратную сторону, постепенно увеличивая обучающий набор данных.
![](https://habrastorage.org/getpro/habr/upload_files/fc2/de7/68b/fc2de768b394721b9a3f0d3905c51195.gif)
Итогом этой симуляции будет n оценок модели на одном и том же наборе тестовых данных, что позволит точно понять, какая конфигурация оказалась лучшей.
Изменение распределения целевой переменной
Часто бывает так, что поведение целевой переменной нестабильно во времени. Ещё больше нестабильности вносит тот факт, что модель прямо влияет на её распределение (в нашем примере).
![](https://habrastorage.org/getpro/habr/upload_files/003/8d9/7a4/0038d97a4a0035ba37506dc4ed9f8e38.gif)
Здесь видно, как зона распределения условной целевой переменной постепенно увеличивается с течением времени. Это означает, что применение ML-модели в новой области, которой не было в обучающей выборке, может быть непредсказуемо.
Частично эту проблему должно решать правило частоты переобучения модели. Но ещё на этапе моделирования мы можем оценить влияние нестабильного поведения предсказываемой переменной на целевую метрику. Для этого нужно провести симуляцию, в которой мы искусственно будем уменьшать или увеличивать на n% баланс положительного класса. Таким образом мы сможем сделать выводы о стабильности нашего жизненного цикла при нетипичном изменении (таком, которого не было в обучающей выборке) целевой переменной.
Прочие отраслевые вопросы
Самый простой пример: а что будет, если бизнес нашей компании вырастет на 20 % за n дней? Останется ли наш алгоритм стабильным, если завтра все входные признаки для модели увеличатся или уменьшатся на 20 %?
Алгоритм проверки аналогичен тому, что описан выше. Проводим симуляцию и проверяем, как увеличение или уменьшение того или иного признака влияет на стабильность целевой метрики. Если она ухудшается, то, возможно, стоит ещё раз пересмотреть частоту переобучения модели.
Все названные параметры могут как зависеть друг о друга, так и быть независимыми. Поэтому следует учитывать это при симуляции жизненного цикла. Идеальным решением подбора конфигурации будет оптимизация всех параметров сразу по сетке (как это происходит при подборе классических гиперпараметров).
Мы разработали правила жизненного цикла, что дальше?
Вот мы и получили набор правил работы ML-модели. Половина дела сделана, осталось запустить жизненный цикл в production и мониторить его работу.
Поскольку ещё на этапе моделирования мы предусмотрели большинство но не все потенциальных проблем, то можно ожидать стабильной работы модели некоторе время без внешнего вмешательства.
P.S. Проводя симуляции, не забывайте фиксировать random seed!