Фаза 02 · урок 16

Обнаружение аномалий

Цель урока: Кредитной картой пользуются в Нью-Йорке в 14:00, а затем в Токио в 14:05. Датчик на фабрике показывает 150 градусов, когда нормальный диапазон — 80–120. Сервер отправляет 50 000 запросов в секунду, хотя среднее за день — 200.

Текущий релиз AlexBred.com: первые 100 уроков русскоязычной программы.

Курс
AI Engineering from Scratch
Фаза
Основы машинного обучения
Чтение
21 мин.
Проверено
Содержание урока
  1. Цели обучения
  2. Проблема
  3. Концепция
  4. Типы аномалий
  5. Неконтролируемая постановка
  6. Контролируемый и неконтролируемый подходы: компромисс
  7. Метод Z-оценки
  8. Метод IQR
  9. Isolation Forest
  10. Локальный фактор выброса (LOF)
  11. Сравнение
  12. Сложности оценки
  13. Конвейер обнаружения аномалий
  14. Соберите это
  15. Детектор Z-оценки
  16. Детектор IQR
  17. Isolation Forest с нуля
  18. Демонстрационные сценарии
  19. Используйте это
  20. Параметр contamination в sklearn
  21. One-Class SVM
  22. Подход с автоэнкодером (предварительный обзор)
  23. Ансамблевое обнаружение аномалий
  24. Аспекты продакшена
  25. Внедрите это
  26. Выбор порога
  27. Масштабирование до продакшена
  28. Упражнения
  29. Ключевые термины
  30. Дополнительное чтение

Норму определить легко. Аномалия — всё, что в неё не вписывается.

Тип: Сборка Язык: Python Предварительные требования: Фаза 2, уроки 01–09 Время: ~75 минут

Цели обучения

  • Реализовать с нуля методы обнаружения аномалий на основе Z-оценки, IQR и Isolation Forest
  • Различать точечные, контекстные и коллективные аномалии и выбирать для каждого подходящий метод обнаружения
  • Объяснять, почему обнаружение аномалий формулируется как моделирование нормальных данных, а не как классификация аномалий
  • Сравнивать неконтролируемое обнаружение аномалий с контролируемой классификацией и оценивать компромисс между охватом новых аномалий и точностью

Проблема

Кредитной картой пользуются в Нью-Йорке в 14:00, а затем в Токио в 14:05. Датчик на фабрике показывает 150 градусов, когда нормальный диапазон — 80–120. Сервер отправляет 50 000 запросов в секунду, хотя среднее за день — 200.

Это аномалии. Их обнаружение важно. Мошенничество обходится в миллиарды. Отказы оборудования приводят к простоям. Сетевые вторжения стоят данных.

Проблема в том, что у вас редко есть размеченные примеры аномалий. Мошеннические операции составляют 0,1 % транзакций. Отказы оборудования случаются несколько раз в год. Стандартный классификатор обучить нельзя: в классе «аномалия» почти нет примеров, на которых можно учиться. Даже если у вас есть несколько меток, увиденные аномалии — не единственные типы, с которыми вы столкнётесь. Завтрашняя схема мошенничества будет отличаться от сегодняшней.

Обнаружение аномалий переворачивает задачу. Вместо изучения того, что ненормально, изучайте то, что нормально. Всё, что отклоняется от нормы, вызывает подозрение. Такой подход работает без меток, адаптируется к новым типам аномалий и масштабируется на огромные наборы данных.

Концепция

Типы аномалий

Не все аномалии одинаковы:

  • Точечные аномалии. Одна точка данных, необычная независимо от контекста. Показание температуры 500 градусов. Транзакция на $50 000 с аккаунта, который обычно тратит $50.
  • Контекстные аномалии. Точка данных, необычная с учётом контекста. Температура 90 градусов нормальна летом, но аномальна зимой. То же значение, другой контекст.
  • Коллективные аномалии. Последовательность точек данных, необычная как группа, хотя каждая отдельная точка может быть нормальной. Пять неудачных входов — нормально. Пятьдесят подряд — это атака перебором.

Большинство методов обнаруживают точечные аномалии. Контекстным аномалиям нужны признаки времени или местоположения. Коллективным аномалиям нужны методы, учитывающие последовательность.

Диаграмма к уроку «Обнаружение аномалий»

Неконтролируемая постановка

В стандартной классификации у вас есть метки для обоих классов. При обнаружении аномалий обычно встречается одна из трёх ситуаций:

  1. Полностью неконтролируемая. Меток нет вовсе. Вы подгоняете детектор на всех данных и надеетесь, что аномалии достаточно редки, чтобы не исказить модель «нормы».
  2. Полуконтролируемая. У вас есть чистый набор только нормальных данных. Вы обучаетесь на этом чистом наборе и оцениваете всё остальное. Это наиболее сильная постановка, когда она возможна.
  3. Слабо контролируемая. У вас есть несколько размеченных аномалий. Используйте их для оценки, а не для обучения. Обучайтесь неконтролируемо, а затем измеряйте precision/recall на размеченном подмножестве.

Главная идея: обнаружение аномалий фундаментально отличается от классификации. Вы моделируете распределение нормальных данных, а не границу решения между двумя классами.

Контролируемый и неконтролируемый подходы: компромисс

Если у вас всё-таки есть размеченные аномалии, следует использовать их для обучения (контролируемая классификация) или только для оценки (неконтролируемое обнаружение)?

Контролируемый подход (считать задачей классификации):

  • Обнаруживает точные типы аномалий, которые вы уже видели
  • Даёт более высокую точность для известных типов аномалий
  • Полностью пропускает новые типы аномалий
  • Требует переобучения при появлении новых типов аномалий
  • Нуждается в достаточном числе примеров аномалий (а их часто слишком мало)

Неконтролируемый подход (моделировать норму, помечать отклонения):

  • Выявляет любое отклонение от нормы, включая новые типы
  • Не требует размеченных аномалий
  • Имеет более высокий уровень ложноположительных срабатываний (не всё необычное плохо)
  • Более устойчив к сдвигу распределения

На практике лучшие системы объединяют оба подхода: неконтролируемое обнаружение для широкого охвата, контролируемые модели для известных приоритетных типов аномалий и проверку человеком для неоднозначных случаев.

Метод Z-оценки

Самый простой подход. Вычислите среднее и стандартное отклонение каждого признака. Помечайте любую точку, находящуюся более чем на k стандартных отклонений от среднего.

z_score = (x - mean) / std
anomaly if |z_score| > threshold

Порог по умолчанию равен 3,0 (99,7 % нормальных данных находятся в пределах 3 стандартных отклонений для гауссовского распределения).

Сильные стороны: простота, скорость, интерпретируемость («это значение находится на расстоянии 4,5 стандартных отклонений от нормы»).

Слабые стороны: предполагает нормальное распределение данных. Чувствителен к выбросам в обучающих данных (выбросы сдвигают среднее и увеличивают std, поэтому их труднее обнаружить). Не работает на мультимодальных распределениях.

Когда хорошо работает: мониторинг одного признака, когда данные примерно колоколообразны. Время отклика сервера, допуски производства, показания датчиков со стабильной базовой линией.

Когда не работает: данные с несколькими кластерами (два офиса с разной базовой температурой), скошенные данные (сумма транзакции $1000 редка, но не аномальна), данные с выбросами в обучающем наборе.

Метод IQR

Более устойчив, чем Z-оценка. Вместо среднего и стандартного отклонения использует межквартильный размах.

Q1 = 25th percentile
Q3 = 75th percentile
IQR = Q3 - Q1
lower_bound = Q1 - factor * IQR
upper_bound = Q3 + factor * IQR
anomaly if x < lower_bound or x > upper_bound

Коэффициент по умолчанию — 1,5.

Сильные стороны: устойчивость к выбросам (на перцентили не влияют экстремальные значения). Работает на скошенных распределениях. Не предполагает нормальность.

Слабые стороны: только одномерный метод (применяется к каждому признаку независимо). Не может обнаружить аномалии, необычные лишь при совместном рассмотрении признаков (точка может быть нормальной по каждому отдельному признаку, но аномальной в совместном пространстве).

Практическое замечание: коэффициент 1,5 в IQR соответствует усам диаграммы размаха. Точки вне усов — потенциальные выбросы. Использование 3,0 вместо 1,5 делает детектор более консервативным (меньше отметок, меньше ложноположительных срабатываний). Правильный коэффициент зависит от вашей терпимости к ложным тревогам.

Isolation Forest

Главная идея: аномалии редки и отличаются от остальных. При случайном разбиении данных аномалии проще изолировать — им требуется меньше случайных разбиений, чтобы отделиться от остальных.

Диаграмма к уроку «Обнаружение аномалий»

Как это работает:

  1. Постройте много случайных деревьев (лес изолирования).
  2. В каждом узле выберите случайный признак и случайное значение разбиения между минимумом и максимумом этого признака.
  3. Продолжайте делить, пока каждая точка не будет изолирована (в собственном листе).
  4. Аномалии имеют меньшую среднюю длину пути по всем деревьям.

Почему это работает: нормальные точки находятся в плотных областях. Чтобы изолировать одну из её соседей, нужно много случайных разбиений. Аномалии находятся в разреженных областях. Одного или двух случайных разбиений достаточно, чтобы изолировать их.

Оценка аномальности основана на средней длине пути по всем деревьям, нормированной ожидаемой длиной пути случайного бинарного дерева поиска:

score(x) = 2^(-average_path_length(x) / c(n))

Где c(n) — ожидаемая длина пути для n образцов. Оценка, близкая к 1, означает аномалию. Близкая к 0,5 — норму. Близкая к 0 — очень нормальную точку (глубоко в плотных кластерах).

Сильные стороны: нет предположений о распределении. Работает в пространствах высокой размерности. Хорошо масштабируется (сублинейно по размеру выборки, потому что каждое дерево использует подвыборку). Обрабатывает смешанные типы признаков.

Слабые стороны: плохо справляется с аномалиями в плотных областях (эффект маскирования). Случайные разбиения менее эффективны, когда много нерелевантных признаков.

Основные гиперпараметры:

  • n_estimators: число деревьев. Обычно достаточно 100. Большее число деревьев даёт более стабильные оценки, но замедляет вычисления.
  • max_samples: число образцов на дерево. 256 — значение по умолчанию в исходной статье. Меньшие значения делают отдельные деревья менее точными, но увеличивают разнообразие. Подвыборка делает Isolation Forest быстрым: каждое дерево видит небольшую долю данных.
  • contamination: ожидаемая доля аномалий. Используется только для задания порога. На сами оценки не влияет.

Локальный фактор выброса (LOF)

LOF сравнивает локальную плотность вокруг точки с плотностью вокруг её соседей. Точка в разреженной области, окружённая плотными областями, аномальна.

Как это работает:

  1. Для каждой точки найдите её k ближайших соседей.
  2. Вычислите локальную достижимую плотность (насколько плотно её окружение).
  3. Сравните плотность каждой точки с плотностями её соседей.
  4. Если плотность точки намного ниже плотности соседей, это выброс.

Оценка LOF:

  • LOF, близкий к 1,0, означает плотность, сходную с плотностью соседей (норма).
  • LOF больше 1,0 означает меньшую плотность, чем у соседей (потенциальная аномалия).
  • LOF намного больше 1,0 (например, 2,0+) означает существенно меньшую плотность (вероятная аномалия).

«Локальная» часть критична. Рассмотрите набор данных с двумя кластерами: плотный кластер из 1000 точек и разреженный кластер из 50 точек. Точка на краю разреженного кластера не необычна глобально — у неё есть 50 соседей. Но она локально необычна, если её непосредственные соседи плотнее, чем она сама. LOF улавливает этот нюанс, который пропускают глобальные методы.

Сильные стороны: обнаруживает локальные аномалии (точки, необычные в своём окружении, даже если они не необычны глобально). Работает на кластерах разной плотности.

Слабые стороны: медленный на больших наборах данных (O(n^2) при наивной реализации). Чувствителен к выбору k. Плохо работает в очень высоких размерностях (проклятие размерности влияет на расчёты расстояний).

Сравнение

Метод Предположения Скорость Высокая размерность Обнаруживает локальные аномалии
Z-оценка Нормальное распределение Очень высокая Да (по признакам) Нет
IQR Нет (по признакам) Очень высокая Да (по признакам) Нет
Isolation Forest Нет Высокая Да Частично
LOF Расстояние имеет смысл Низкая Плохо Да

Сложности оценки

Оценивать детекторы аномалий сложнее, чем классификаторы:

  • Крайний дисбаланс классов. При 0,1 % аномалий предсказание «норма» для всего даёт 99,9 % точности. Accuracy бесполезна.
  • AUROC вводит в заблуждение. При сильном дисбалансе AUROC может выглядеть хорошо, даже когда модель пропускает большинство аномалий на практически применимых порогах.
  • Лучшие метрики: Precision@k (сколько из k наиболее отмеченных элементов являются реальными аномалиями), AUPRC (площадь под кривой precision-recall) и recall при фиксированной доле ложноположительных срабатываний.

Диаграмма к уроку «Обнаружение аномалий»

Конвейер обнаружения аномалий

На практике обнаружение аномалий следует этому рабочему процессу:

  1. Соберите базовые данные. В идеале — период, когда вы знаете, что аномалий нет (или очень мало).
  2. Спроектируйте признаки. Используйте исходные и производные признаки (скользящая статистика, признаки времени, отношения).
  3. Обучите детектор. Подгоните его на базовых данных. Модель изучит, как выглядит «норма».
  4. Оцените новые данные. Каждое новое наблюдение получает оценку аномальности.
  5. Выберите порог. Выберите отсечение по оценке. Это бизнес-решение: более высокий порог означает меньше ложных тревог, но больше пропущенных аномалий.
  6. Подайте сигнал и расследуйте. Отмеченные точки поступают на проверку человеком или автоматическую реакцию.
  7. Собирайте обратную связь. Записывайте, были ли отмеченные элементы настоящими аномалиями или ложными тревогами. Используйте эти данные для оценки детектора и настройки порога с течением времени.

Конвейер никогда не бывает «завершён». Распределения данных смещаются, появляются новые типы аномалий, и пороги требуют корректировки. Относитесь к обнаружению аномалий как к живой системе, а не одноразовой модели.

Соберите это

Код в code/anomaly_detection.py реализует с нуля Z-оценку, IQR и Isolation Forest.

Детектор Z-оценки

def zscore_detect(X, threshold=3.0):
    mean = X.mean(axis=0)
    std = X.std(axis=0)
    std[std == 0] = 1.0
    z = np.abs((X - mean) / std)
    return z.max(axis=1) > threshold

Простая векторизованная реализация. Она помечает точку, если любой признак превышает порог.

Детектор IQR

def iqr_detect(X, factor=1.5):
    q1 = np.percentile(X, 25, axis=0)
    q3 = np.percentile(X, 75, axis=0)
    iqr = q3 - q1
    iqr[iqr == 0] = 1.0
    lower = q1 - factor * iqr
    upper = q3 + factor * iqr
    outside = (X < lower) | (X > upper)
    return outside.any(axis=1)

Isolation Forest с нуля

Реализация с нуля строит деревья изоляции, которые случайно разбивают пространство признаков:

class IsolationTree:
    def __init__(self, max_depth):
        self.max_depth = max_depth

    def fit(self, X, depth=0):
        n, p = X.shape
        if depth >= self.max_depth or n <= 1:
            self.is_leaf = True
            self.size = n
            return self
        self.is_leaf = False
        self.feature = np.random.randint(p)
        x_min = X[:, self.feature].min()
        x_max = X[:, self.feature].max()
        if x_min == x_max:
            self.is_leaf = True
            self.size = n
            return self
        self.threshold = np.random.uniform(x_min, x_max)
        left_mask = X[:, self.feature] < self.threshold
        self.left = IsolationTree(self.max_depth).fit(X[left_mask], depth + 1)
        self.right = IsolationTree(self.max_depth).fit(X[~left_mask], depth + 1)
        return self

Длина пути до изоляции точки определяет её оценку аномальности. Более короткие пути означают большую аномальность.

Класс IsolationForest объединяет несколько деревьев:

class IsolationForest:
    def __init__(self, n_estimators=100, max_samples=256, seed=42):
        self.n_estimators = n_estimators
        self.max_samples = max_samples

    def fit(self, X):
        sample_size = min(self.max_samples, X.shape[0])
        max_depth = int(np.ceil(np.log2(sample_size)))
        for _ in range(self.n_estimators):
            idx = rng.choice(X.shape[0], size=sample_size, replace=False)
            tree = IsolationTree(max_depth=max_depth)
            tree.fit(X[idx])
            self.trees.append(tree)

    def anomaly_score(self, X):
        avg_path = average path length across all trees
        scores = 2.0 ** (-avg_path / c(max_samples))
        return scores

Нормирующий множитель c(n) — ожидаемая длина пути неудачного поиска в бинарном дереве поиска с n элементами. Он равен 2 * H(n-1) - 2*(n-1)/n, где H — гармоническое число. Эта нормировка гарантирует сопоставимость оценок между наборами данных разного размера.

Демонстрационные сценарии

Код создаёт несколько тестовых сценариев:

  1. Один кластер с выбросами. Двумерный гауссовский кластер с аномалиями, добавленными далеко от центра. Здесь должны работать все методы.
  2. Мультимодальные данные. Три кластера разного размера и плотности. Точки между кластерами аномальны. Z-оценка испытывает трудности, потому что диапазоны отдельных признаков широки.
  3. Данные высокой размерности. 50 признаков, но аномалии отличаются лишь по 5 из них. Проверяется, могут ли методы найти аномалии в подмножестве признаков.

Каждая демонстрация сравнивает все методы по precision, recall, F1 и Precision@k.

Используйте это

Со sklearn (с библиотечными, а не реализованными с нуля версиями):

from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor

iso = IsolationForest(n_estimators=100, contamination=0.05, random_state=42)
iso.fit(X_train)
predictions = iso.predict(X_test)

lof = LocalOutlierFactor(n_neighbors=20, contamination=0.05, novelty=True)
lof.fit(X_train)
predictions = lof.predict(X_test)

Обратите внимание: contamination задаёт ожидаемую долю аномалий. Важно задать её корректно: слишком низкое значение пропускает аномалии, слишком высокое создаёт ложные тревоги.

Код в anomaly_detection.py сравнивает реализации с нуля со sklearn на одних и тех же данных.

Параметр contamination в sklearn

Параметр contamination в sklearn определяет порог преобразования непрерывных оценок аномальности в бинарные предсказания. Он не меняет базовые оценки.

iso_5 = IsolationForest(contamination=0.05)
iso_10 = IsolationForest(contamination=0.10)

Оба варианта создают одинаковые оценки аномальности. Но iso_5 отмечает верхние 5 %, а iso_10 — верхние 10 %. Если вы не знаете истинную долю аномалий (а обычно не знаете), установите contamination в значение "auto" и работайте непосредственно с исходными оценками. Задайте собственный порог на основе компромисса стоимости ложноположительных и ложноотрицательных результатов.

One-Class SVM

Ещё один неконтролируемый детектор аномалий, о котором стоит знать. One-Class SVM подгоняет границу вокруг нормальных данных в пространстве признаков высокой размерности (используя kernel trick).

from sklearn.svm import OneClassSVM

oc_svm = OneClassSVM(kernel="rbf", gamma="auto", nu=0.05)
oc_svm.fit(X_train)
predictions = oc_svm.predict(X_test)

Параметр nu приближённо задаёт долю аномалий. One-Class SVM хорошо работает на малых и средних наборах данных, но не масштабируется на очень большие данные (матрица ядер растёт квадратично).

Подход с автоэнкодером (предварительный обзор)

Автоэнкодеры — нейронные сети, которые учатся сжимать и восстанавливать данные. Обучайте их на нормальных данных. Во время теста у аномалий будет высокая ошибка реконструкции, потому что сеть научилась восстанавливать только нормальные шаблоны.

Это рассматривается в фазе 3 («Глубокое обучение»), но принцип тот же: моделируйте норму и помечайте то, что отклоняется от неё.

Ансамблевое обнаружение аномалий

Подобно тому как ансамблевые методы улучшают классификацию (урок 11), объединение нескольких детекторов аномалий улучшает обнаружение. Самый простой подход:

  1. Запустите несколько детекторов (Z-оценка, IQR, Isolation Forest, LOF).
  2. Нормализуйте оценки каждого детектора к диапазону [0, 1].
  3. Усредните нормализованные оценки.
  4. Помечайте точки выше порога по средней оценке.

Это уменьшает число ложноположительных срабатываний, потому что у разных методов разные режимы отказа. Точка, отмеченная всеми четырьмя методами, почти наверняка аномальна. Точка, отмеченная только одним, может быть особенностью этого метода.

Более сложные ансамбли взвешивают каждый детектор по его оценённой надёжности (измеренной на валидационном наборе с известными аномалиями, если он доступен).

Аспекты продакшена

  1. Дрейф порога. По мере сдвига распределения данных фиксированный порог устаревает. Отслеживайте распределение оценок аномальности и периодически корректируйте его.
  2. Усталость от тревог. Слишком много ложных тревог — и операторы перестанут обращать на них внимание. Начинайте с высокого порога (меньше, но надёжнее тревоги) и снижайте его по мере роста доверия.
  3. Ансамблевый подход. В продакшене объединяйте несколько детекторов. Помечайте точку, только если несколько методов считают её аномальной. Это существенно снижает ложноположительные срабатывания.
  4. Проектирование признаков. Исходных признаков редко достаточно. Добавляйте скользящую статистику, отношения, время с последнего события и предметно-специфичные признаки. Хороший набор признаков важнее выбора детектора.
  5. Петля обратной связи. Когда операторы исследуют отмеченные элементы и подтверждают или отклоняют их, возвращайте это в систему. Со временем накапливайте размеченные данные для оценки и улучшения детектора.

Внедрите это

Этот урок создаёт:

  • outputs/skill-anomaly-detector.md – навык выбора подходящего детектора
  • code/anomaly_detection.py – Z-оценка, IQR и Isolation Forest с нуля, со сравнением со sklearn

Выбор порога

Оценка аномальности непрерывна. Чтобы принимать бинарные решения, нужен порог. Это бизнес-решение, а не техническое.

Рассмотрите два сценария:

  • Обнаружение мошенничества. Пропустить мошенничество дорого (возврат средств, доверие клиентов). Ложная тревога стоит аналитику 5 минут расследования. Установите низкий порог, чтобы поймать больше мошенничества, и примите больше ложных тревог.
  • Обслуживание оборудования. Ложная тревога означает ненужную остановку стоимостью $50 000. Пропущенный отказ означает ремонт на $500 000. Установите порог, балансирующий эти затраты.

В обоих случаях оптимальный порог зависит от соотношения стоимости ложноположительных и ложноотрицательных ошибок. Постройте precision и recall для разных порогов, наложите функцию стоимости и выберите точку минимальной стоимости.

Масштабирование до продакшена

Для обнаружения аномалий в реальном времени в продакшене:

  1. Пакетное обучение, онлайн-оценка. Периодически обучайте модель (ежедневно, еженедельно) на недавних нормальных данных. Оценивайте каждое новое наблюдение по мере поступления.
  2. Вычисление признаков должно совпадать. Если обучение использовало скользящую статистику за 30 дней, для вычисления признаков нового наблюдения вам нужна история за 30 дней. Буферизуйте необходимую историю.
  3. Мониторинг распределения оценок. Отслеживайте распределение оценок аномальности во времени. Если медианная оценка дрейфует вверх, либо меняются данные, либо устарела модель.
  4. Объяснимость. Когда вы помечаете аномалию, объясняйте почему. Z-оценка: «признак X находится на 4,2 стандартных отклонения выше нормы». Isolation Forest: «эта точка была изолирована в среднем за 3,1 разбиения (нормальным точкам требуется 8,5)».

Упражнения

  1. Настройка порога. Запустите детектор Z-оценки с порогами от 1,0 до 5,0 с шагом 0,5. Постройте precision и recall на каждом пороге. Где для ваших данных находится оптимальная точка?

  2. Многомерные аномалии. Создайте 2D-данные, где каждый признак по отдельности выглядит нормальным, но их комбинация аномальна (например, точки далеко от диагонали основного кластера). Покажите, что Z-оценка по признакам пропускает такие точки, а Isolation Forest их обнаруживает.

  3. LOF с нуля. Реализуйте Local Outlier Factor с помощью k ближайших соседей. Сравните с LocalOutlierFactor из sklearn на одних и тех же данных. Используйте k=10 и k=50 — как выбор k влияет на результаты?

  4. Потоковое обнаружение аномалий. Модифицируйте детектор Z-оценки для потокового режима: обновляйте текущее среднее и дисперсию по мере поступления новых точек (онлайн-алгоритм Уэлфорда). Сравните с пакетной Z-оценкой на одних и тех же данных.

  5. Оценка на реальных данных. Возьмите набор данных с известными аномалиями (например, мошенничество с кредитными картами из Kaggle). Оцените все четыре метода по precision@100, precision@500 и AUPRC. Какой метод работает лучше? Почему?

Ключевые термины

Термин Как обычно говорят Что это действительно означает
Аномалия «Выброс, необычная точка» Точка данных, значительно отклоняющаяся от ожидаемого шаблона нормальных данных
Точечная аномалия «Одно странное значение» Отдельное наблюдение, необычное независимо от контекста
Контекстная аномалия «Нормальное значение в неверном контексте» Наблюдение, необычное с учётом контекста (времени, места и т. д.), но способное быть нормальным в другом контексте
Isolation Forest «Случайные разбиения для поиска выбросов» Ансамбль случайных деревьев, который изолирует аномалии меньшим числом разбиений, чем нормальные точки
Local Outlier Factor «Сравнение плотности с соседями» Метод, помечающий точки, чья локальная плотность намного ниже плотности их соседей
Z-оценка «Стандартные отклонения от среднего» (x - mean) / std, измерение расстояния точки от центра в единицах стандартного отклонения
IQR «Межквартильный размах» Q3 - Q1, мера разброса средних 50 % данных, используемая для устойчивого обнаружения выбросов
Contamination «Ожидаемая доля аномалий» Гиперпараметр, сообщающий детектору, какую долю данных следует пометить как аномальную
Precision@k «Сколько настоящих среди k главных отметок» Precision, вычисленная только на k наиболее подозрительных точках; полезна при несбалансированном обнаружении аномалий
AUPRC «Площадь под кривой precision-recall» Метрика, обобщающая качество precision-recall по всем порогам; лучше AUROC для несбалансированных данных

Дополнительное чтение


Источник: Anomaly Detection 02.15 — Основы временных рядов · Фаза 2 — Основы машинного обучения · Полный каталог · 02.17 — Несбалансированные данные