Настройка мониторинга дрифта модели (Data Drift, Concept Drift)

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1Все 1566 услуг
Настройка мониторинга дрифта модели (Data Drift, Concept Drift)
Средний
~3-5 дней
Часто задаваемые вопросы

Направления AI-разработки

Этапы разработки AI-решения

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

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1288
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    902
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1123
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    590
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    860

Настройка мониторинга дрифта модели (Data Drift, Concept Drift)

Деградация ML-модели в production редко бывает мгновенной — она происходит постепенно, и без специализированного мониторинга команда замечает проблему слишком поздно: когда бизнес-метрики уже упали. Мониторинг дрифта позволяет обнаружить изменения в данных или в поведении модели на ранней стадии.

Типы дрифта

Data drift (covariate shift) — изменение распределения входных признаков. Модель видит данные, отличающиеся от тех, на которых обучалась. Пример: сезонное изменение покупательского поведения меняет распределение признака "среднее время между покупками".

Concept drift — изменение зависимости между признаками и целевой переменной. Пример: паттерны мошенничества меняются, и признаки, которые раньше надёжно предсказывали фрод, теряют предсказательную силу.

Label drift — изменение распределения целевой переменной. Пример: доля положительных примеров в задаче бинарной классификации значительно изменилась.

Prediction drift — изменение распределения предсказаний модели. Можно мониторить без labeled данных.

Статистические тесты для обнаружения дрифта

Тест Применение Пороговое значение
Kolmogorov-Smirnov Непрерывные признаки p-value < 0.05
Chi-squared Категориальные признаки p-value < 0.05
PSI (Population Stability Index) Бинарные/категориальные PSI > 0.2 — сильный дрифт
Jensen-Shannon Divergence Любые распределения JS > 0.1
Maximum Mean Discrepancy Мультивариатный дрифт Зависит от kernel

Инструменты мониторинга

Evidently AI — open-source библиотека для генерации отчётов о дрифте:

from evidently.report import Report
from evidently.metric_preset import DataDriftPreset, ModelQualityPreset

report = Report(metrics=[
    DataDriftPreset(),
    ModelQualityPreset(),
])

report.run(
    reference_data=training_data,
    current_data=production_data_last_week
)
report.save_html("drift_report.html")

Whylogs / WhyLabs — легковесная библиотека для логирования статистических профилей данных в реальном времени. Минимальный overhead на production-инференс.

Arize AI, Fiddler, Arthur — коммерческие платформы с готовыми дашбордами, алертами и возможностью разметки production-данных.

Grafana + Prometheus — кастомный мониторинг, где метрики дрифта экспортируются как Prometheus-метрики.

Мониторинг без ground truth

Классическая проблема: в production ground truth (правильный ответ) появляется с задержкой или не появляется вовсе. Без labeled данных можно мониторить:

  • Prediction drift — изменение распределения предсказаний
  • Feature drift — изменение распределения входных признаков
  • Confidence distribution — изменение уверенности модели
  • Business proxy metrics — например, CTR как прокси для качества рекомендаций

Настройка алертов

# Интеграция с Grafana Alerting
def compute_psi(expected, actual, buckets=10):
    expected_hist, _ = np.histogram(expected, bins=buckets, density=True)
    actual_hist, _ = np.histogram(actual, bins=buckets, density=True)
    # Сглаживание для избежания деления на ноль
    expected_hist = np.where(expected_hist == 0, 1e-6, expected_hist)
    actual_hist = np.where(actual_hist == 0, 1e-6, actual_hist)
    psi = np.sum((actual_hist - expected_hist) * np.log(actual_hist / expected_hist))
    return psi

# Экспорт в Prometheus
psi_value = compute_psi(reference_feature, production_feature)
prometheus_client.Gauge('model_feature_psi', 'PSI for feature X').set(psi_value)

Алерты настраиваются в Grafana: PSI > 0.2 — warning, PSI > 0.25 — critical с уведомлением в Slack/PagerDuty.

Процесс реагирования

При обнаружении дрифта: 1) анализ изменений в данных, 2) решение о переобучении или инженерном исправлении признаков, 3) если concept drift — возможна потребность в переработке архитектуры модели. Мониторинг без процесса реагирования бесполезен — важно заранее описать runbook для каждого типа алерта.