Настройка мониторинга дрифта модели (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 для каждого типа алерта.







