# Поиск аномалий без надёжной разметки > Детектор выдаёт 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 ```python 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`](../assignments/03_anomaly.md). - Предыдущая глава: [`03_dimensionality_reduction.md`](03_dimensionality_reduction.md). - Метрики и пороги: [`../../06_classical_ml/notes/03_metrics_thresholds_and_calibration.md`](../../06_classical_ml/notes/03_metrics_thresholds_and_calibration.md). - Термины: [`../glossary.md`](../glossary.md).