Data drift: как понять, что данные в проде уже не похожи на train

Data drift без мистики: как понять, что данные в проде уже не похожи на train, почему это опасно и какие сигналы стоит мониторить.

Содержание Следующие статьи
Содержание Data drift: как понять, что данные в проде уже не похожи на train
  1. Почему модель может испортиться, даже если код и веса не менялись
  2. Как drift удобно описать формально
  3. Почему это так опасно для модели
  4. Как посмотреть на это на Python

Почему модель может испортиться, даже если код и веса не менялись

Одна из самых неприятных особенностей ML-систем в том, что модель может деградировать без единой правки в репозитории. Код тот же, артефакт тот же, сервис отвечает как раньше, а качество постепенно становится хуже. Частая причина — data drift. Это ситуация, когда распределение входных данных в проде начинает отличаться от того, на чем модель обучалась.

Для инженера это очень важный сдвиг мышления: проблема иногда живет не внутри модели, а в том мире, который подается ей на вход.

Как drift удобно описать формально

Формула: раздел математики — теория вероятностей
$$ P_{train}(X) \neq P_{prod}(X) $$
Что означает эта формула

Data drift означает, что распределение признаков в продакшене стало другим по сравнению с обучающей выборкой. Даже если модель осталась прежней, ее рабочая среда изменилась.

Что означает каждый символ
  • P_{train}(X) — распределение признаков на обучающей выборке
  • P_{prod}(X) — распределение признаков на продовых данных
  • X — вектор входных признаков

Эта запись полезна тем, что убирает магию. Drift — это не ощущение, что «что-то пошло не так», а конкретное изменение входного распределения.

Почему это так опасно для модели

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

При этом drift не всегда сразу виден по бизнес-метрике. Иногда сначала меняются только входные признаки, а падение качества проявляется позже.

Как посмотреть на это на Python

example.pyPython
import pandas as pd  # создаем train и prod срезы одного и того же признака

train = pd.Series([10, 12, 11, 13, 12, 14], name='avg_check')  # историческое распределение признака на train
prod = pd.Series([18, 20, 19, 22, 21, 23], name='avg_check')  # новое распределение того же признака в проде
summary = pd.DataFrame({  # собираем простую сводку по двум срезам данных
    'train_mean': [train.mean()],  # среднее исторического распределения
    'prod_mean': [prod.mean()],  # среднее текущего продового распределения
    'train_std': [train.std()],  # разброс на обучении
    'prod_std': [prod.std()],  # разброс в проде
})
print(summary.round(3))  # сравниваем, насколько сильно входной мир сдвинулся

Это очень простой индикатор, но даже он помогает увидеть суть: drift начинается с того, что модель получает уже не тот тип данных, под который была настроена. А значит, monitoring должен смотреть не только на предсказания, но и на входы.

Что читать дальше

Связанные статьи по этой теме

Canary deployment для моделей: как выкатывать новую версию без лишнего риска Latency в ML API: почему быстрая модель важна не меньше точной Batch inference и real-time inference: как выбирать режим работы модели
Вернуться в блог