Налаштування моніторингу дрейфу моделі (Data Drift, Concept Drift)
Деградація ML-моделі в production рідко буває миттєвою — вона відбувається поступово, і без спеціалізованого моніторингу команда помічає проблему занадто пізно: коли бізнес-метрики вже впали. Моніторинг дрейфу дозволяє виявити зміни в даних або поведінці моделі на ранній стадії.
Типи дрейфу
Data drift (covariate shift) — зміна розподілу вхідних ознак. Модель бачить дані, що відрізняються від тих, на яких вона навчалася. Приклад: сезонні зміни поведінки покупців змінюють розподіл ознаки "середній час між покупками".
Concept drift — зміна залежності між ознаками та цільовою змінною. Приклад: схеми шахрайства змінюються, і ознаки, які раніше надійно передбачали шахрайство, втрачають передбачувальну силу.
Label drift — зміна розподілу цільової змінної. Приклад: частка позитивних прикладів у задачі бінарної класифікації значно змінилася.
Prediction drift — зміна розподілу передбачень моделі. Можна моніторити без розмічених даних.
Статистичні тести для виявлення дрейфу
| Тест | Застосування | Поріг |
|---|---|---|
| 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 — бібліотека з відкритим кодом для генерування звітів про дрейф:
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 — легка бібліотека для логування статистичних профілів даних в реальному часі. Мінімальна надлишкова вага на production-інференс.
Arize AI, Fiddler, Arthur — комерційні платформи з готовими панелями управління, сигналами та можливістю розмітки production-даних.
Grafana + Prometheus — користувацький моніторинг, де метрики дрейфу експортуються як Prometheus-метрики.
Моніторинг без ground truth
Класична проблема: в production ground truth (правильна відповідь) з'являється з затримкою або взагалі не з'являється. Без розмічених даних можна моніторити:
- 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 — попередження, PSI > 0.25 — критичний із сповіщенням у Slack/PagerDuty.
Процес реагування
При виявленні дрейфу: 1) аналіз змін у даних, 2) рішення про переnavigation або інженерне виправлення ознак, 3) якщо concept drift — може знадобитися перепроектування архітектури моделі. Моніторинг без процесу реагування марний — важливо заздалегідь описати runbook для кожного типу сигналу.







