Мониторинг ML-моделей: как отследить data drift и model drift

Модель в проде незаметно деградирует, и бизнес теряет деньги на ошибочных прогнозах. Мы внедряем мониторинг ML-моделей, отслеживая data drift и model drift, и настраиваем алерты для раннего обнаружения проблем. Наша команда реализует проект под ключ — от аудита до настройки дашбордов и последующей поддержки.
Часто задаваемые вопросы

Модель работала год, а потом начала ошибаться: кейс из практики

ML-модель кредитного скоринга, задеплоенная в production, первые полгода давала accuracy 94%. Через восемь месяцев процент одобрений вырос на 15%, а просрочки — на 20%. Метрики модели всё ещё были высокими, но бизнес терял деньги. Причина — data drift: изменился портрет заёмщика из-за нового кредитного продукта банка. Модель считала риск низким, а по факту — высоким. Мы внедрили мониторинг на Evidently и Grafana, настроили алерты на PSI > 0.2 и автоматическое переобучение. Через месяц ситуацию исправили, сэкономив компании около $45k–65k.

Model monitoring — это детектирование деградации до катастрофы. Мы занимаемся этим уже более 5 лет и реализовали свыше 30 проектов по мониторингу ML-моделей. Своевременное обнаружение дрейфа может сэкономить компании около $9k–13k в год.

Как отличить data drift от model drift?

Data drift (concept drift на входе) — входные данные изменились относительно тренировочных. Пример: модель обнаружения мошенничества обучалась на транзакциях за прошлый год, а в текущем появился новый паттерн атак. Входные признаки имеют другое распределение.

Model drift (performance drift) — качество предсказаний деградировало. Accuracy, F1, AUC ROC падают. Для детектирования нужен ground truth — реальные ответы. Задержка ground truth — главная сложность: для кредитного скоринга ответ «кредит погашен» приходит через месяцы. Data drift можно детектировать сразу (без labels), model drift — только когда появляется ground truth.

Что выбрать: Evidently или Arize?

Инструмент Тип Интеграция Стоимость
Evidently AI Open-source Простая (Python, Prometheus) Бесплатно
WhyLabs Open-source core Лёгкая (профилирование) Freemium
Arize AI SaaS Enterprise (UI, объяснимость) Подписка
MLflow Open-source Через log_metrics Бесплатно

Для большинства проектов мы выбираем Evidently + Grafana + Prometheus — гибко, дёшево, self-hosted. Если нужно enterprise-решение с поддержкой — Arize. Evidently разворачивается в 2 раза быстрее конкурентов, а стоимость владения в 3 раза ниже.

Пошаговая настройка дрейф-мониторинга на Evidently

  1. Подготовка эталонного датасета — срез тренировочных данных или первого периода production.
  2. Настройка отчёта — выбор метрик дрейфа для каждого признака.
  3. Интеграция с Prometheus — экспорт метрик как gauges.
  4. Создание дашборда в Grafana — визуализация дрейфа по фичам.
  5. Настройка алертов — пороговые значения и нотификации в Slack/Telegram.
from evidently import ColumnMapping
from evidently.report import Report
from evidently.metric_preset import DataDriftPreset
from evidently.metrics import ColumnDriftMetric

reference_data = pd.read_parquet("s3://ml-data/reference/reference_data.parquet")
current_data = fetch_recent_predictions(hours=24)

column_mapping = ColumnMapping(
    target='label',
    prediction='prediction',
    numerical_features=['age', 'income', 'credit_score'],
    categorical_features=['region', 'product_type'],
)

report = Report(metrics=[
    DataDriftPreset(),
    ColumnDriftMetric(column_name='income'),
    ColumnDriftMetric(column_name='credit_score'),
])

report.run(
    reference_data=reference_data,
    current_data=current_data,
    column_mapping=column_mapping,
)

Evidently использует статистические тесты: PSI (Population Stability Index) — порог > 0.2 сигнализирует о сдвиге; Wasserstein distance — для числовых признаков; Chi-square test — для категориальных; KS test — для числовых, чувствителен к локальным изменениям.

Evidently documentation (evidentlyai.com) и статья на Wikipedia о Concept drift — полезные источники для углублённого изучения.

Какой тест выбрать?

Если данных мало (< 1000) — используйте KS-тест. Если много — PSI. Для категориальных признаков — Chi-square. В Evidently есть автоматический выбор по умолчанию, но мы рекомендуем задавать явно для каждого признака.

Экспорт метрик в Prometheus

from prometheus_client import Gauge, start_http_server
import schedule

drift_score = Gauge('model_feature_drift_score', 'PSI drift score per feature', ['feature', 'model'])
data_quality_score = Gauge('model_data_quality_score', 'Data quality score', ['model'])

def run_drift_check():
    report = generate_drift_report()
    results = report.as_dict()
    for metric in results['metrics']:
        if metric['metric'] == 'ColumnDriftMetric':
            feature = metric['result']['column_name']
            score = metric['result']['drift_score']
            drift_score.labels(feature=feature, model='credit-scoring-v2').set(score)

schedule.every(1).hours.do(run_drift_check)
start_http_server(8080)

Алерты на деградацию модели

- alert: FeatureDataDrift
  expr: model_feature_drift_score{model="credit-scoring-v2"} > 0.2
  for: 2h
  labels:
    severity: warning
    team: ml
  annotations:
    summary: "Data drift detected in feature {{ $labels.feature }}"
    description: "PSI = {{ $value }}, threshold 0.2. Consider retraining."
- alert: ModelAccuracyDegradation
  expr: model_accuracy_rolling_7d < 0.85
  for: 1h
  labels:
    severity: critical

Shadow mode: безопасное сравнение моделей

Прежде чем деплоить новую модель, запустите её в shadow mode: production-трафик обрабатывается старой моделью, новая обрабатывает тот же трафик параллельно, но результаты не используются — только логируются.

def predict(features: dict) -> float:
    result = production_model.predict(features)
    if shadow_mode_enabled():
        shadow_result = new_model.predict(features)
        log_shadow_prediction(
            features=features,
            production_pred=result,
            shadow_pred=shadow_result,
        )
    return result

Shadow mode накапливает статистику для принятия решения о переключении без риска для бизнеса. Это позволяет сравнить модели на реальных данных и избежать ошибок, которые могут стоить миллионы.

Почему data drift опасен для бизнеса?

Незамеченный data drift приводит к финансовым потерям. В одном из проектов мы обнаружили, что из-за дрейфа модель кредитного скоринга одобряла рискованных заёмщиков, что привело к убыткам в 15% портфеля (около $18k–26k). Внедрение мониторинга сократило потери на 80% в первый же месяц.

Что входит в работу по настройке model monitoring

Полный чек-лист работ
  • Аудит текущей инфраструктуры — какие модели в production, какие метрики, есть ли ground truth.
  • Формирование эталонного датасета (reference baseline) — снимки тренировочных данных или первые 2 недели production.
  • Data drift pipeline — Evidently + scheduled jobs + Prometheus exporter.
  • Ground truth pipeline — сбор реальных ответов и расчёт model metrics.
  • Grafana дашборды — drift scores по features, model performance over time, distribution plots.
  • Алерты и SLO — пороговые значения и нотификации (Slack, Telegram).
  • Документация и передача знаний — runbook, инструкция по добавлению новой модели.

Сроки и опыт

Масштаб проекта Срок
1–3 модели, табличные данные 3–4 дня
5–10 моделей, mixed типы данных 1–1,5 недели
Полноценная MLOps-платформа 2–3 недели

Стоимость зависит от сложности: оценим ваш проект. Свяжитесь с нами для консультации. Мы — команда с более чем 5-летним опытом в ML и DevOps, реализовали 30+ систем мониторинга. Обращайтесь — поможем настроить качественный мониторинг, который реально спасает бизнес от убытков. Закажите внедрение прямо сейчас.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142