10 KiB
Поиск аномалий без надёжной разметки
Детектор выдаёт score необычности относительно выбранных данных и признаков. Аномалия не тождественна ошибке, мошенничеству или полезному инциденту.
Постановки задачи
- Outlier detection: train уже может содержать аномалии; нужно описать его основную массу и отметить редкие наблюдения.
- Novelty detection: train считается нормальным, новые объекты проверяются на отклонение. Оценивать train тем же fitted-методом часто оптимистично.
- Supervised rare-event classification: есть надёжные метки; это уже классификация с дисбалансом, и метки следует использовать.
Аномалии бывают точечными, контекстными (температура необычна для сезона) и коллективными (последовательность необычна, хотя отдельные точки нормальны). Сначала задают единицу анализа, контекст и действие после alert.
Score, contamination и порог
Пусть s(\mathbf x) растёт с аномальностью. Hard-решение:
\hat y=\mathbb1\{s(\mathbf x)\ge t\}.
contamination обычно задаёт квантиль score и тем самым ожидаемую долю
срабатываний, а не обучает истинную вероятность аномалии. Если известен бюджет
B проверок в день, естественный baseline — top-B score. При наличии
редких меток порог выбирают по precision@B, recall при допустимом FPR или
ожидаемой стоимости, затем проверяют на более позднем периоде.
Статистические baselines
Для одномерных примерно симметричных данных z-score:
z_i=\frac{x_i-\bar x}{s}.
Среднее и стандартное отклонение сами чувствительны к выбросам. Устойчивый вариант использует медиану и MAD:
\operatorname{MAD}=\operatorname{median}_i|x_i-\operatorname{median}(x)|,\quad
z_i^{\rm robust}=0.6745\frac{x_i-\operatorname{median}(x)}{\operatorname{MAD}}.
Множитель согласует scale с нормальным распределением. Порог 3 — эвристика и не учитывает множественные проверки, тяжёлые хвосты и сезонность.
Gaussian-модель использует Mahalanobis distance
D^2(\mathbf x)=(\mathbf x-\boldsymbol\mu)^\top
\boldsymbol\Sigma^{-1}(\mathbf x-\boldsymbol\mu).
Она учитывает корреляции, но ковариация нестабильна при d близком к n и
чувствительна к contamination; нужны shrinkage/robust covariance.
Isolation Forest
Случайное дерево выбирает признак и случайный split между минимумом и максимумом.
Редкую изолированную точку обычно отделяют малым числом splits. Средняя длина
пути E[h(\mathbf x)] нормируется ожидаемой длиной неуспешного поиска:
s(\mathbf x,n)=2^{-E[h(\mathbf x)]/c(n)},\quad
c(n)\approx2H_{n-1}-2(n-1)/n.
Score около 1 указывает на лёгкую изоляцию. Метод масштабируется, не требует оценивать плотность и ловит многомерные эффекты. Но осевые случайные splits, нерелевантные признаки и высокая размерность могут ухудшить результат.
Local Outlier Factor
LOF сравнивает локальную плотность объекта с плотностью соседей. Reachability distance сглаживает слишком малые расстояния:
\operatorname{reach}_k(p,o)=\max\{d_k(o),d(p,o)\}.
Локальная reachability density — обратное среднее этих расстояний, а
\operatorname{LOF}_k(p)=
\frac1{|N_k(p)|}\sum_{o\in N_k(p)}
\frac{\operatorname{lrd}_k(o)}{\operatorname{lrd}_k(p)}.
LOF около 1 означает сопоставимую с соседями плотность, значительно больше 1 —
локальный выброс. Метод ловит аномалию рядом с плотной группой даже при других
глобальных плотностях, но зависит от масштаба, k и стоимости соседей. В
sklearn для новых данных нужен novelty=True; тогда нельзя интерпретировать
predict на train как обычный outlier fit.
One-Class SVM и реконструкция
One-Class SVM с RBF-ядром отделяет основную массу в feature space от начала
координат. \nu\in(0,1] контролирует верхнюю границу доли train-нарушений и
нижнюю границу доли опорных векторов; \gamma задаёт локальность. Метод
чувствителен к scaling и плохо масштабируется по n.
PCA/autoencoder могут использовать reconstruction error
\|\mathbf x-\hat{\mathbf x}\|^2: необычный объект хуже восстанавливается
моделью нормальной структуры. Это работает лишь если train преимущественно
нормален и модель не настолько гибка, чтобы хорошо реконструировать всё.
Категориальные и разномасштабные признаки требуют содержательной loss.
Оценка при слабой разметке
Полностью доказать качество без предположений или меток нельзя. Полезен набор проверок:
- Временной holdout и отсутствие будущих статистик в признаках.
- Ручная экспертиза случайной выборки из top-score и обычной зоны.
- Precision@
k, число alerts и coverage разных типов, а не только ROC-AUC. - Стабильность ranking при seed, масштабе, подвыборке и умеренных параметрах.
- Synthetic anomalies только как unit-тест известных сбоев, не как замена реальным аномалиям.
- Мониторинг drift score и доли alerts после запуска.
Active learning помогает направлять дорогую разметку, но выбор только самых аномальных создаёт selection bias; добавляют случайные и пограничные объекты.
Разобранный пример
Для значений [10,10,11,9,10,40] медиана 10, абсолютные отклонения
[0,0,1,1,0,30], MAD равна 0.5 (среднее двух центральных значений
0 и 1). Для 40:
z^{robust}=0.6745(30/0.5)=40.47. Сигнал огромен, но это всё ещё означает
«редко относительно этой выборки», а не «ошибка датчика».
Самостоятельный пример sklearn
import numpy as np
from sklearn.ensemble import IsolationForest
from sklearn.preprocessing import StandardScaler
rng = np.random.default_rng(42)
normal = rng.normal(size=(500, 2))
rare = rng.uniform(6, 8, size=(10, 2))
X = np.vstack([normal, rare])
X = StandardScaler().fit_transform(X)
model = IsolationForest(
n_estimators=300, contamination=10 / 510, random_state=42
)
model.fit(X)
score = -model.score_samples(X) # больше = аномальнее
print("top indices:", np.argsort(score)[-12:][::-1])
В production scaler и detector обучают на прошлом окне, а score считают на будущем; пример лишь демонстрирует API.
Типичные ошибки и ограничения
- Объявлять
contamination=0.01оценкой истинной частоты. - Обучаться на периоде инцидента и поглотить аномалию как норму.
- Использовать случайный split для сезонных временных данных.
- Оценивать только синтетическими далёкими точками.
- Выдавать score за вероятность без калибровочных меток.
- Игнорировать capacity проверяющих и обратную связь после alert.
- Применять один глобальный детектор к неоднородным подгруппам.
Краткое резюме
- Аномалия определяется относительно контекста, данных и действия.
- Isolation Forest использует короткие пути, LOF — локальный дефицит плотности.
- Порог задаётся budget/cost или независимой слабой разметкой.
- Без надёжных меток нужны временной holdout, экспертиза, baselines и устойчивость.
Связанные материалы
-
Практика:
../assignments/03_anomaly.md. -
Предыдущая глава:
03_dimensionality_reduction.md. -
Метрики и пороги:
../../06_classical_ml/notes/03_metrics_thresholds_and_calibration.md. -
Термины:
../glossary.md.