ai_learning/modules/08_unsupervised_learning/notes/04_anomaly_detection.md

10 KiB
Raw Permalink Blame History

Поиск аномалий без надёжной разметки

Детектор выдаёт 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.

Оценка при слабой разметке

Полностью доказать качество без предположений или меток нельзя. Полезен набор проверок:

  1. Временной holdout и отсутствие будущих статистик в признаках.
  2. Ручная экспертиза случайной выборки из top-score и обычной зоны.
  3. Precision@k, число alerts и coverage разных типов, а не только ROC-AUC.
  4. Стабильность ranking при seed, масштабе, подвыборке и умеренных параметрах.
  5. Synthetic anomalies только как unit-тест известных сбоев, не как замена реальным аномалиям.
  6. Мониторинг 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 и устойчивость.

Связанные материалы