Моніторинг ML-моделей: як відстежити data drift і model drift

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

Моніторинг 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

  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% портфеля (близько 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+ систем моніторингу. Звертайтеся — допоможемо налаштувати якісний моніторинг, який реально рятує бізнес від збитків. Замовте впровадження прямо зараз.

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

Останні роботи

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