Уявіть: сервіс моніторингу метрик інфраструктури генерує сотні алертів на день, 90% з яких — хибні. Коли метрики містять тренди, сезонні сплески та концептуальний дрейф, статичні пороги дають понад 60% хибних тривог. В одному з проектів з 500 метриками інженери витрачали по 2 години на день на фільтрацію алертів. Після інтеграції гібридного детектора час розбору скоротився до 15 хвилин, а false positive rate впав на 70% порівняно зі статичними порогами. Зниження витрат на обробку алертів досягає 80%, а економія для типового проєкту — до $100,000 на рік. Згідно з дослідженням NIST з часових рядів, комбінація статистики та машинного навчання — найкращий підхід для детекції аномалій. Машинне навчання для часових рядів дозволяє ефективно виявляти аномалії в даних.
Ми — команда AI-інженерів з 7+ років досвіду в продакшені часових рядів, реалізували 50+ проєктів. Гарантуємо точність детекції не нижче 95% на ваших даних. Оцінимо ваш проєкт безкоштовно — пишіть нам.
Типологія аномалій
Виявлення викидів починається з правильної класифікації аномалій.
Точкові аномалії (викиди): одиничне значення різко вибивається з ряду. Приклад: показання температурного датчика 200°C при нормі 50°C.
Контекстуальні аномалії: значення нормальне саме по собі, але аномальне в контексті. Приклад: температура 35°C у січні (норма влітку, аномалія взимку).
Колективні аномалії: послідовність значень нормальна окремо, але аномальна разом. Приклад: кілька стандартних транзакцій, що утворюють патерн шахрайства.
Чому STL + Isolation Forest — золотий стандарт?
STL-декомпозиція (Seasonal-Trend decomposition using Loess) розділяє ряд на тренд, сезонність та залишок. Аномалії шукаються в залишку — це позбавляє від хибних спрацьовувань на сезонних піках. Isolation Forest на залишках ефективно виловлює точки, які не вписуються в нормальний розподіл. Для потокових даних додаємо онлайн Z-Score з адаптивним порогом.
Такий гібрид працює швидше за LSTM (мілісекунди на точку) і потребує менше даних. У наших проєктах це дає precision >0.95 та recall >0.9. STL + Isolation Forest — наш основний вибір для більшості задач.
Порівняння методів детекції
| Метод | Швидкість | Точність | Пояснюваність | Вимоги до даних |
|---|---|---|---|---|
| Z-Score / MAD | Дуже висока | Середня | Висока | Мінімум (нормальний розподіл) |
| CUSUM | Висока | Середня | Висока | Baseline (перші 50 точок) |
| STL + залишок | Висока | Висока | Висока | Період сезонності |
| Isolation Forest | Середня | Висока | Низька | Вікно ознак (10-50 точок) |
| LSTM Autoencoder | Низька | Дуже висока | Дуже низька | Багато даних, навчання |
Середньостатистичні показники на промислових даних
| Метод | Precision | Recall | Latency p99 (ms) |
|---|---|---|---|
| Z-Score | 0.80 | 0.70 | 0.1 |
| STL + Isolation Forest | 0.95 | 0.90 | 2.0 |
| LSTM Autoencoder | 0.97 | 0.95 | 50 |
Як вибрати поріг детекції і не збожеволіти?
Поріг визначає баланс між пропуском аномалій (False Negative) та хибними спрацьовуваннями (False Positive). Важливе завдання — налаштування порогів детекції. Оптимальний поріг залежить від бізнес-цілей: для критичних метрик (простий сервісу) важливіший recall, для моніторингу продажів — precision. Ми використовуємо validation set і підбираємо поріг за F1-score або за метрикою точності на N-му квантілі. У production поріг адаптується через feedback loop: інженери помічають алерти, і модель перенавчається.
Код методів детекції аномалій
import numpy as np
from scipy.stats import median_abs_deviation
def zscore_anomalies(series, threshold=3.0):
z_scores = np.abs((series - series.mean()) / series.std())
return z_scores > threshold
def mad_anomalies(series, threshold=3.5):
median = np.median(series)
mad = median_abs_deviation(series)
modified_z = 0.6745 * (series - median) / mad
return np.abs(modified_z) > threshold
def cusum_detector(series, k=0.5, h=5.0):
mean = series[:50].mean()
std = series[:50].std()
S_pos = np.zeros(len(series))
S_neg = np.zeros(len(series))
for t in range(1, len(series)):
xi = (series[t] - mean) / std
S_pos[t] = max(0, S_pos[t-1] + xi - k)
S_neg[t] = max(0, S_neg[t-1] - xi - k)
return (S_pos > h) | (S_neg > h)
from statsmodels.tsa.seasonal import STL
def stl_anomaly_detection(series, period=24, threshold=3.5):
stl = STL(series, period=period, robust=True)
result = stl.fit()
residuals = result.resid
mad = median_abs_deviation(residuals)
modified_z = np.abs(0.6745 * (residuals - np.median(residuals)) / mad)
return modified_z > threshold, result
from sklearn.ensemble import IsolationForest
def isolation_forest_detector(series, contamination=0.05, window=10):
features = []
for i in range(window, len(series)):
window_data = series[i-window:i]
features.append([
window_data.mean(),
window_data.std(),
window_data.max() - window_data.min(),
window_data[-1] - window_data.mean(),
np.corrcoef(np.arange(window), window_data)[0,1]
])
features = np.array(features)
iso_forest = IsolationForest(contamination=contamination, random_state=42)
predictions = iso_forest.fit_predict(features)
return predictions == -1
import torch
import torch.nn as nn
class LSTMAutoencoder(nn.Module):
def __init__(self, input_size, hidden_size=64, num_layers=2):
super().__init__()
self.encoder = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.decoder = nn.LSTM(hidden_size, input_size, num_layers, batch_first=True)
def forward(self, x):
_, (h_n, c_n) = self.encoder(x)
decoder_input = h_n[-1].unsqueeze(1).repeat(1, x.size(1), 1)
reconstruction, _ = self.decoder(decoder_input)
return reconstruction
def detect_autoencoder_anomalies(model, series, threshold_quantile=0.95):
with torch.no_grad():
reconstruction = model(series)
re = torch.mean((series - reconstruction)**2, dim=[1, 2])
threshold = torch.quantile(re, threshold_quantile)
return re > threshold
Що входить у роботу
- Код детектора аномалій для моніторингу метрик (Python, готовий до деплою)
- Дашборд у Grafana + алертинг (Telegram, Slack)
- Документація щодо порогів та адаптації
- Навчання вашої команди (2 години)
- Підтримка протягом 2 тижнів після впровадження
Процес реалізації: від аудиту до деплою
- Аналітика — збір історичних даних, виявлення типів аномалій (точкові, контекстуальні, колективні), підбір метрик для моніторингу.
- Проектування — вибір комбінації методів (STL, Isolation Forest, LSTM), визначення початкових порогів.
- Розробка — написання пайплайну детекції, інтеграція з системою моніторингу (Prometheus, Grafana).
- Тестування — валідація на історичних даних, A/B-тест у паралельному режимі, аналіз false positive rate.
- Деплой — встановлення на staging, потім production, налаштування алертів.
- Моніторинг — збір зворотного зв'язку, адаптація порогів, перенавчання моделей при концептуальному дрейфі.
Терміни та вартість
- Базова версія (STL + Isolation Forest + дашборд): від 3 до 4 тижнів, вартість від $5,000.
- Повна версія (LSTM Autoencoder, потокова детекція, feedback loop): від 2 до 3 місяців, вартість від $15,000.
Вартість проєкту визначається після аналізу даних. Оцінимо ваш проєкт безкоштовно — пишіть нам.







