Аномалії без розмітки: як виявити викиди серед 10 млн записів
Зазначимо: коли supervised-моделі з accuracy 99.9% не знаходять жодної аномалії — проблема в дисбалансі класів. Ми будуємо unsupervised-пайплайни на Isolation Forest, Autoencoder та One-Class SVM, які виявляють викиди без ручної розмітки. Такі моделі в 10 разів швидше навчаються, ніж semi-supervised, і не вимагають pre-labeled даних. Однак вибір правильного методу критичний: непідходящий алгоритм може давати до 80% хибних спрацьовувань. Саме тому ми починаємо кожен проєкт з глибокого аналізу структури даних та бізнес-контексту.
Unsupervised підходи дають детекцію без витрат на розмітку: достатньо одного інженера на налаштування. У фінтехі ми використовували Isolation Forest для первинного скринінгу транзакцій — latency p99 < 10 мс, а Autoencoder для фінальної верифікації. У підсумку detection rate зріс на 40% порівняно з rule-based системою, а false positive rate впав у 2 рази. Аномалії становлять менше 0.1% даних, тому accuracy не показова — ми орієнтуємося на Precision/Recall/F1 та AUCPR.
Як вибрати метод детекції аномалій?
| Доступні дані |
Рекомендований підхід |
Приклад часу навчання (100k записів) |
| Розмічені аномалії (< 1%) |
Imbalanced supervised (LightGBM з scale_pos_weight) |
2-5 хвилин |
| Тільки нормальні дані |
One-Class SVM / Autoencoder / Deep SVDD |
10-30 хвилин |
| Немає розмітки взагалі |
Unsupervised: Isolation Forest, LOF |
< 1 хвилини |
| Часові ряди з сезонністю |
STL + residual detection |
5-10 хвилин |
| Послідовності подій |
LSTM Autoencoder |
30-60 хвилин |
Коли використовувати Autoencoder замість Isolation Forest?
Autoencoder краще підходить для складних, багатовимірних даних, де аномалії проявляються в нелінійних залежностях. Наприклад, у кібербезпеці при детекції атак на основі логів подій — Isolation Forest показує низьку точність, а Autoencoder навчається за 1-2 години і дає AUCPR > 0.9. Для простих табличних даних з чіткими викидами Isolation Forest працює швидше та інтерпретованіше. Ми часто комбінуємо їх: первинний скринінг Isolation Forestом (low latency), потім верифікація Autoencoderом.
Як ми будуємо production-ready pipeline
На практиці ми комбінуємо кілька методів для підвищення стійкості. Наприклад, у проєкті для фінтех-клієнта з 50 млн транзакцій на день: Isolation Forest використовувався для первинної фільтрації (latency p99 < 10 мс), Autoencoder — для глибокої перевірки підозрілих записів. Результат: detection rate зріс на 40% порівняно з правилами, false positive rate знизився в 2 рази.
Реалізація ключових методів
Приклади коду для Isolation Forest та Autoencoder:
import numpy as np
from sklearn.ensemble import IsolationForest
from sklearn.metrics import average_precision_score
def train_isolation_forest(X, contamination=0.01):
"""Базовий Isolation Forest з автоматичним підбором порогу"""
model = IsolationForest(contamination=contamination, random_state=42)
model.fit(X)
scores = model.score_samples(X) # чим нижче, тим аномальніше
return model, scores
# Autoencoder на PyTorch
import torch.nn as nn
class AnomalyAutoencoder(nn.Module):
def __init__(self, input_dim, latent_dim=32):
super().__init__()
self.encoder = nn.Sequential(
nn.Linear(input_dim, 128),
nn.ReLU(),
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, latent_dim)
)
self.decoder = nn.Sequential(
nn.Linear(latent_dim, 64),
nn.ReLU(),
nn.Linear(64, 128),
nn.ReLU(),
nn.Linear(128, input_dim)
)
def anomaly_score(self, x, reduction='mean'):
with torch.no_grad():
z = self.encoder(x)
x_rec = self.decoder(z)
re = torch.mean((x - x_rec)**2, dim=1)
return re
Для production ми пакуємо модель у ONNX Runtime та розгортаємо на Triton Inference Server — це дає мінімальну затримку та високу пропускну здатність.
Оцінка та continuous learning
Правильні метрики для незбалансованого класу:
def evaluate_aupr(y_true, y_scores):
return average_precision_score(y_true, y_scores)
Порівняння метрик для датасету з 0.1% аномалій:
| Метрика |
Типове значення |
Чому важлива |
| Accuracy |
99.9% |
Вводить в оману — модель не знаходить аномалій |
| AUCPR |
0.85-0.95 |
Показує якість ранжування аномалій |
| Fβ-score |
0.75-0.90 |
Враховує дисбаланс, налаштовується під бізнес-пріоритети |
Ми використовуємо MLflow для відстеження експериментів: параметри (contamination, latent_dim), метрики (AUCPR, FPR), артефакти (моделі, PR-криві). Feedback loop донавчає модель кожні 1000 міток від інженерів.
Приклад налаштування MLflow-експерименту
mlflow experiments create --experiment-name anomaly-detection
mlflow run . -P model=isolation_forest -P contamination=0.01
Процес роботи над проєктом
- Аналітика — вивчення даних, виявлення сезонності та типів аномалій.
- Проєктування — вибір стеку та архітектури pipeline.
- Реалізація — навчання baseline та підбір гіперпараметрів.
- Тестування — валідація на історичних даних з A/B-тестом.
- Деплой — контейнеризація, моніторинг, CI/CD.
Що входить в роботу
- Навчена модель з документацією по метриках та порогах.
- REST API для інференсу (FastAPI або Triton).
- MLflow дашборд з історією експериментів.
- Feedback loop для донавчання за мітками операторів.
- Навчання вашої команди (2-3 години воркшопу).
- Технічна підтримка на 30 днів після деплою.
Терміни орієнтовно
Базова модель (Isolation Forest + оцінка) — від 2 до 3 тижнів. Повний pipeline з Autoencoder, feedback loop та production deployment — від 6 до 8 тижнів. Вартість розраховується індивідуально, виходячи з обсягу даних та необхідної точності. Окупність рішення настає протягом 2-3 місяців за рахунок скорочення часу на аналіз інцидентів.
Гарантуємо якість: всі моделі проходять валідацію на відкладеній вибірці. У нас більше 5 років досвіду в MLOps та 20+ реалізованих проєктів з детекції аномалій у фінтехі, телекомі та промисловості. Для оцінки вашого кейсу зв'яжіться з нами — оцінимо задачу за 2 дні та запропонуємо рішення під ключ. Отримайте консультацію з детекції аномалій на ваших даних.
Виявлення аномалій: автоенкодери, Isolation Forest, PyOD
Ми стикаємося з цим болем постійно: моніторинг сервера показує CPU 85%, пам'ять 91% — це норма в годину пік чи початок атаки? Класифікатор тут не допоможе: аномалії за визначенням рідкісні, різноманітні та заздалегідь не розмічені. Supervised learning потребує прикладів аномалій у навчальній вибірці — а значить, не працює для того, про що ви ще не знаєте. Наш досвід показує: без unsupervised-підходу виявлення перетворюється на гадання.
Чому виявлення аномалій потребує unsupervised підходу?
Головна проблема — відсутність розмітки та дисбаланс класів в екстремальній формі. Фрод-транзакції становлять 0.01–0.1% від загального об'єму. Виробничий дефект — 0.5–3%. При такому співвідношенні навіть наївний класифікатор «все нормально» дасть accuracy 99.9% і precision/recall для аномального класу, близькі до нуля. Supervised-моделі тут безсилі.
Друга проблема — «нормальність» завжди контекстна. Чи нормально, що користувач логіниться о 3 годині ночі? Залежить від його історії та часової зони. Чи нормальна вібрація підшипника 2.3 мм/с? Залежить від режиму роботи верстата та його віку. Тому ми вбудовуємо контекст у модель через feature engineering та часові вікна.
Третя — оцінка якості. Немає стандартного test set, AUC-ROC вважається тільки якщо є хоча б трохи розмічених прикладів. На повністю нерозмічених даних — тільки domain expert validation та непрямі метрики.
Як відрізнити аномалію від шуму в реальному часі?
Відповідь — адаптивні пороги та моніторинг статистик моделі. У розділі кейсу покажемо, як це працює.
Методи та інструменти
| Метод |
Тип даних |
Швидкість навчання |
Типове застосування |
| Isolation Forest |
Табличні, категоріальні |
Висока |
Baseline для перших гіпотез |
| Autoencoder |
Зображення, часові ряди, логи |
Середня |
Неструктуровані дані |
| LSTM-AE |
Багатовимірні часові ряди |
Низька |
Промислова телеметрія |
| PyOD (ансамбль) |
Табличні |
Висока |
Швидке порівняння 40+ методів |
Isolation Forest — стандартний baseline для табличних даних. Ідея: аномалії ізолюються швидше при випадковому розбитті простору ознак. Працює добре при contamination 0.01–0.1, стійкий до масштабу ознак, не потребує нормалізації. Реалізація в sklearn.ensemble.IsolationForest.
Типова помилка: ставити contamination='auto' без розуміння даних. Auto-режим передбачає поріг -0.5, що не завжди відповідає реальній частці аномалій. Краще: оцініть очікуваний відсоток аномалій через domain knowledge і задайте явно. Ми гарантуємо підбір contamination під ваш кейс.
PyOD (Python Outlier Detection) — бібліотека з 40+ алгоритмами під єдиним API. Включає: OCSVM, LOF, COPOD, ECOD, DeepSVDD, AutoEncoder. Зручно для швидкого порівняння методів на одних даних.
Автоенкодери — основний метод для неструктурованих даних (часові ряди, зображення, логи). Ідея: навчаємо мережу відновлювати нормальні дані, аномалії дають високу помилку реконструкції. Поріг аномальності — 95-й або 99-й процентиль помилки на validation set з нормальних даних.
Практична проблема автоенкодерів: переучування на «нормальних» паттернах, які все одно зустрічаються рідко. Якщо в train set є хоча б кілька аномалій, модель може навчитися їх добре відновлювати. Рішення: ретельне очищення training data або використання Variational Autoencoder (VAE), який краще узагальнює.
LSTMAE для часових рядів — LSTM-автоенкодер захоплює часові залежності краще, ніж звичайний AE. Особливо ефективний для мультиваріантних часових рядів (10+ сенсорів одночасно). Реалізація через PyTorch, навчання з MSELoss на ковзних вікнах.
Детально: виявлення аномалій у промислових часових рядах
Задача: вібраційні датчики на 12 насосах хімічного підприємства, 6 сенсорів на насос, частота 100 Гц. Потрібно попередити про наближену поломку за 4–24 години.
Архітектура рішення:
Сирові дані → feature extraction (RMS, куртозис, піковий фактор, FFT-амплітуди на резонансних частотах) → нормалізація по ковзному вікну 24 год → LSTMAE → reconstruction error → порогова логіка + алертинг.
Розмір вікна LSTM: 60 секунд (6000 точок на 100 Гц). Занадто мале вікно — не захоплює повільні паттерни. Занадто велике — втрачає чутливість до швидких змін.
Поріг аномальності: не фіксований, а адаптивний. threshold = mean(errors_last_7d) + 3 * std(errors_last_7d). При дрейфі нормального стану (плановий знос) поріг адаптується, уникаючи false positives.
Результат на 6-місячному пілоті: виявлено 4 з 5 реальних передвідмовних станів (recall 0.8), 2 хибні тривоги за 6 місяців (precision 0.67). До впровадження: 3 незаплановані зупинки зі значними збитками. Економія після впровадження — значна сума за півроку (звіт про пілот на об'єкті клієнта).
Фрод-детекція: специфіка фінансових даних
Фінансові транзакції мають кілька особливостей, що ускладнюють виявлення:
- Concept drift: паттерни фроду змінюються швидше нормальної поведінки. Модель, навчена півроку тому, застаріває.
- Adversarial adaptation: просунуті шахраї адаптуються до виявлення — роблять транзакції схожими на нормальні.
- Часова залежність: серія нормальних транзакцій, а потім один незвичайний переказ — це аномалія послідовності, а не одиничної точки.
Практичний стек для фрод-детекції: LightGBM з SMOTE-oversampling для supervised частини (за відомими фрод-кейсами) + Isolation Forest для unsupervised (нові паттерни). Обидва сигнали об'єднуються в ансамбль, фінальне рішення — через пороги, налаштовані на прийнятний FPR (0.1–1% від транзакцій на ручну перевірку).
Як оцінити якість без розмітки?
Коли ground truth немає, для оцінки використовуємо:
- Synthetic anomaly injection: додаємо штучні аномалії (spike, level shift, point outlier) і дивимося, чи виявляє їх модель
- Expert validation: випадкова вибірка топ-K аномалій від моделі → review експерта → precision
- Business metric: чи знизилася кількість пропущених інцидентів / хибних тривог після впровадження
Технічна деталь: налаштування адаптивного порогу
Поріг обчислюється як mean(errors) + k * std(errors) на ковзному вікні 7 днів. Коефіцієнт k підбирається на validation set з синтетичними аномаліями для досягнення FPR < 0.1%. При дрейфі ознак вікно автоматично зсувається.
Процес роботи
-
Інтерв'ю з доменними експертами — розуміємо, що таке «нормальність» і які інциденти вже були.
-
EDA та підготовка даних — очищення, створення ознак, часові вікна.
-
Baseline (Isolation Forest) — швидка валідація на відомих інцидентах.
-
Вибір та кастомізація моделі — Autoencoder / LSTM-AE / ансамбль.
-
Навчання, валідація з синтетичними аномаліями.
-
Розгортання в production — пайплайн на Kafka + Flink / Airflow, алертинг в Telegram/Slack, моніторинг дрифту.
-
Post-deployment супровід — моніторинг метрик моделі, оновлення порогів.
Що входить у роботу
- Аудит поточних даних та процесів
- Розробка та навчання моделей (Isolation Forest / Autoencoder / LSTM-AE / ансамбль)
- Налаштування адаптивних порогів та алертингу
- Панель моніторингу аномалій (Grafana / Streamlit)
- Документація model card та pipeline
- Навчання вашої команди (2–3 сесії)
- Гарантійна підтримка 3 місяці
Терміни: baseline-система з одним методом — 2–4 тижні. Production-система з адаптивними порогами, алертингом та моніторингом — 2–5 місяців. Вартість розраховується індивідуально під ваш кейс.
Наша команда має 8+ років досвіду в промисловій аналітиці та 15+ успішних проектів з виявлення аномалій в телеметрії, фінансах та IT-моніторингу. Отримайте консультацію — розкажемо, як вирішити вашу задачу.