Моніторинг ML-моделей: як відстежити data drift і model drift
Модель працювала рік, а потім почала помилятися: кейс з практики
ML-модель кредитного скорингу, задеплоєна в production, перші півроку давала accuracy 94%. Через вісім місяців відсоток схвалень зріс на 15%, а прострочки — на 20%. Метрики моделі все ще були високими, але бізнес втрачав гроші. Причина — data drift: змінився портрет позичальника через новий кредитний продукт банку. Модель вважала ризик низьким, а насправді — високим. Ми впровадили моніторинг на Evidently та Grafana, налаштували алерти на PSI > 0.2 та автоматичне перенавчання. Через місяць ситуацію виправили, заощадивши компанії близько 5 млн гривень.
Model monitoring — це детектування деградації до катастрофи. Ми займаємося цим вже понад 5 років і реалізували понад 30 проєктів з моніторингу ML-моделей. Своєчасне виявлення дрейфу може заощадити компанії мільйони гривень на рік.
Як відрізнити 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 розгортається вдвічі швидше за конкурентів, а вартість володіння втричі нижча.
Покрокове налаштування дрейф-моніторингу на Evidently
- Підготовка еталонного датасету — зріз тренувальних даних або першого періоду production.
- Налаштування звіту — вибір метрик дрейфу для кожної ознаки.
- Інтеграція з Prometheus — експорт метрик як gauges.
- Створення дашборду в Grafana — візуалізація дрейфу по фічам.
- Налаштування алертів — порогові значення та нотифікації в 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 resultShadow mode накопичує статистику для прийняття рішення про перемикання без ризику для бізнесу. Це дозволяє порівняти моделі на реальних даних та уникнути помилок, які можуть коштувати мільйони.
Чому data drift небезпечний для бізнесу?
Непомічений data drift призводить до фінансових втрат. В одному з проєктів ми виявили, що через дрейф модель кредитного скорингу схвалювала ризикованих позичальників, що призвело до збитків у 15% портфеля (близько 2 млн гривень). Впровадження моніторингу скоротило втрати на 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+ систем моніторингу. Звертайтеся — допоможемо налаштувати якісний моніторинг, який реально рятує бізнес від збитків. Замовте впровадження прямо зараз.







