anomaly detection что это
Истина где‑то рядом — ищем аномалии с Python. Часть 2: практика
В первой части статьи мы обсудили, какие бывают аномалии в реальном мире, почему важно их находить и как для этого используется машинное обучение. Теперь попробуем извлечь из аномалий реальную пользу и применим наши знания на практике с помощью нескольких примеров на Python.
Начнём с того, что визуально оценим набор данных и посмотрим, сможем ли мы найти аномалии. Файл Jupyter Notebook с нижеизложенным кодом можно найти здесь.
Для начала создадим синтетический набор данных, который будет содержать только два столбца:
— ФИО сотрудников организации (для 100 человек)
— их ежемесячная заработная плата (в долларах США) в диапазоне от 1000 до 2500.
Чтобы сгенерировать похожие на настоящие имена, мы будем использовать Python-библиотеку Faker, а для зарплаты подойдёт привычная numpy. После этого объединим созданные столбцы в Pandas DataFrame.
Примечание: не пренебрегайте работой с фиктивными наборами данных, это действительно важный экспериментальный навык!
Давайте вручную изменим зарплату двух человек, чтобы создать выбросы. В реальности это может произойти по ряду причин, например, из-за невнимательности бухгалтера или сбоя программного обеспечения.
Теперь можно начать эксперименты.
Видеть значит верить: находим аномалии глазами
Подсказка: ящики с усами великолепны!
Как упоминалось в предыдущей статье, появление аномалий напрямую зависит от генерации самих данных. Рассмотрим немного базовой статистики (минимальное значение, максимальное, значение 1-го квартиля и т. д.) в виде ящика с усами (диаграммы размаха):
Обратите внимание на маленький кружок в самом низу. Он сразу даёт понять, что что-то не так, потому что сильно отличается от остальных данных.
Как насчёт гистограмм?
На графике выше мы тоже видим отклоняющуюся ячейку. Ось Y даёт понять, что зарплата искажена только у двух сотрудников.
Какой же способ сразу подтвердит наличие аномалий в наборе данных? Давайте посмотрим на минимальное и максимальное значение столбца «Заработная плата» (Salary):
Минимальное значение явно отклоняется от того, что было задано раньше (1000 долларов). Следовательно, это действительно аномалия.
Примечание: хотя наш набор данных содержит только один признак (зарплату), в настоящих датасетах аномалии могут встречаться в разных признаках. Но даже там такие визуализации помогут вам их обнаружить.
Кластерный подход для обнаружения аномалий
Мы выяснили, что кластеризация и поиск аномалий тесно связаны, хоть и служат разным целям. Но кластеризацию можно использовать для детектирования выбросов. В этом разделе мы рассмотрим аномалии в виде групп похожих объектов. Математически их схожесть измеряется такими функциями, как евклидово расстояние, манхэттенское расстояние и т. д. Евклидово расстояние — самое распространённое, поэтому остановимся на нём подробнее.
Очень короткая заметка о евклидовом расстоянии
Если в двумерном пространстве есть n точек (см. следующий рисунок) и их координаты обозначены (x_i, y_i), то евклидово расстояние между любыми двумя точками x1, y1 и x2, y2 равно:
Для кластеризации мы будем использовать метод k-средних. Начнём:
Теперь импортируем модуль kmeans из scipy.cluster.vq. SciPy (Scientific Python) — это библиотека для различных научных расчётов. Применим kmeans к salary_raw:
Во фрагменте выше мы указали в kmeans данные о зарплате и количество кластеров, по которым хотим сгруппировать точки. centroids — это центроиды, сгенерированные kmeans, а avg_distance — усреднённое евклидово расстояние между ними и точками. Давайте извлечём наши кластеры с помощью метода vq(). Его аргументы это:
— центроид, сгенерированный алгоритмом кластеризации.
Метод возвращает группы точек (кластеры) и расстояния между точками и ближайшими кластерами.
Теперь вы точно видите аномалии. Итак, несколько моментов, которые необходимо учитывать перед обучением модели:
Вышеуказанный метод обнаружения аномалий — пример обучения без учителя. Если бы у нас были метки классов, мы могли бы легко превратить процесс в обучение с учителем и рассматривать его как проблему классификации.
Обнаружение аномалий как проблема классификации
Для этого нам понадобится добавить к набору данных целевые переменные (метки). Сначала присвоим всем записям нулевые метки, а затем вручную отредактируем два значения для аномалий (установим их как 1):
Снова взглянем на датасет:
Теперь мы решаем задачу бинарной классификации. Будем искать выбросы, основываясь на подходе близости (proximity-based anomaly detection). Основная идея в том, что близость аномальной точки к её соседним точкам сильно отличается от близости других точек к их соседям. Если вам ничего не понятно, не пугайтесь — на наглядном примере всё станет ясно.
Для этого мы применим метод k-ближайших соседей и Python-библиотеку PyOD, специально предназначенную для детектирования выбросов.
Столбец “Person” для модели совершенно бесполезен, поскольку служит лишь идентификатором. Подготовим обучающую выборку:
Аргументы, переданные в KNN():
— contamination: количество аномалий в данных (в процентах), в нашем случае 2/100
— n_neighbors: число соседей, упитывающихся при измерении близости
Теперь получим прогнозируемые метки и оценку аномалий. Чем выше оценка, тем хуже данные. Для этого применим удобные функции PyOD:
Попробуем оценить KNN() относительно обучающей выборки с помощью функции evaluate_print():
Видим, что KNN() достаточно хорошо работает на обучающих данных. Он выдаёт три метрики и их оценки:
Примечание: при обнаружении аномалий всегда следует учитывать эти оценки, поскольку они дают наиболее полное представление об эффективности модели.
У нас нет тестовой выборки, но мы можем сгенерировать примерное значение зарплаты:
Давайте проверим, может ли модель пометить это значение как выброс:
Вывод должен быть: array([1])
Видим, что модель не ошиблась. Проверим, как она работает с нормальными данными:
Вывод: array([0])
Модель отметила значение как обычную точку данных.
На этом мы завершаем исследование аномалий и переходим к заключению.
Проблемы и дальнейшие исследования
Мы познакомились с миром аномалий и некоторыми его особенностями. Прежде чем подвести итоги, неплохо было бы обсудить несколько проблем, которые затрудняют задачу поиска выбросов:
— Эффективное разделение данных на «нормальные» и «аномальные»: иногда трудно найти границу, которая будет служить индикатором выбросов, особенно в задачах из совершенно разных предметных областей. Придётся либо тратить много времени на изучение данных, либо консультироваться с соответствующими специалистами.
— Понимание разницы между шумом и аномалиями: если принять выбросы за шум или наоборот, то можно изменить весь ход процесса обнаружения аномалий, поэтому следует уделять внимание этому вопросу.
Теперь поговорим о том, как вам продвинуться в исследованиях и улучшить качество данных. Вот несколько тем, которые мы не затронули в статье:
— Обнаружение аномалий во временных рядах: очень важная область, поскольку временные ряды широко распространены.
— Методы поиска аномалий, основанные на глубоком обучении: нейросети тоже могут помогать в поиске выбросов, и эта тема уже давно и активно исследуется.
Надеемся, что эта статья помогла вам немного погрузиться в фантастический мир поиска аномалий. Подготовка данных — один из самых непростых и кропотливых процессов в машинном обучении. И теперь вы стали на шаг ближе к тому, чтобы научиться обрабатывать их максимально эффективно. Если у вас возникли какие-то вопросы — не стесняйтесь задавать их в комментариях, мы обязательно ответим и поможем разобраться.
Deep Anomaly Detection
Детекция аномалий с помощью методов глубокого обучения
Гетерогенность разных классов объектов: непохожесть может быть разной
Редкость появление аномалий: имбаланс классов в обучении
Различные типы аномалий: одиночные объекты, обычные объекты, но в аномальных условиях, группы объектов (слишком плотный граф фейк-аккаунтов социальной сети)
При этом с точки зрения машинного обучения можно назвать следующие основные трудности в поставленной задаче:
Низкие значения precision метрики в задаче классификации на аномальный / нормальный (частое ложное срабатывание алгоритмов на нормальных данных)
Проблема больших размерностей данных
Отсутствие или недостаток размеченных данных
Неустойчивость алгоритмов к зашумленным объектам
Детекция аномалий целой группы объектов
Низкая интерпретируемость результатов
Категоризация подходов
В своей недавней статье [2] G. Pang приводит следующую классификацию существующих подходов для решения поставленной задачи.
Автор разбивает все алгоритмы на три большие группы:
рис. 2. Deep learning for feature extraction
рис. 3. Learning feature representation of normality
рис. 4. End-to-end anomaly score learning
Далее рассмотрим каждую группы по отдельности, указывая уже конкретные методы глубокого обучения для решения задачи в сформулированных рамках.
Deep learning for feature extraction
Как уже отмечалось в этом подходе мы попытаемся уменьшить размерность входных данных. Можно было бы использовать стандартный методы, такие как PCA (principal component analysis) [3] или random projection [4], но для детекции аномалий необходимо сохранить семантическую составляющую каждого объекта, с чем отлично справятся нейронные сети. И в зависимости от типа данных можем выбрать предобученные модели MLP, если имеем дело с табличный данными, СNNs для работы с изображениями, RNNs для предобработки последовательных данных (видеоряд).
При этом основным плюсом такого подхода будет наличие предобученных моделей для почти любого типа данных, но при этом для нахождении anomaly score полученное признаковое пространство может быть далеко не оптимальным.
Learning feature representation of normality
Как видно из рис.1 этот тип можно разделить на два подтипа.
Generic Normality Feature Learning. Подходы в этом классе алгоритмов при преобразовании исходных признаков всё ещё используют функцию потерь не для детекции аномалий напрямую. Но генеративные модели здесь позволяют вычленить ключевую информацию о структуре объектов, тем самым способствуя самой детекции выбросов.
Математическое описание семейства алгоритмов
Рассмотрим конкретные виды архитектур:
Автоэнкодеры
Для задачи DAD главная идея заключается в том, что нормальные данные будут легко реконструированы автоэнкодером, тогда как аномальный объект для модели будет восстановить сложно. [5]
Подробнее об алгоритме
Generative Adversarial Networks
В конкретной задаче DAD генератор будет стараться найти в обученном латентном пространстве вектор, соответветствующий поступающему в него объекту. При этом делается предположение, что так как аномальный объект придет из другого распределения, система быстро различит выброс. AnoGAN [6].
Predictability Modeling. В этом семействе алгоритмов каждый элемент рассматривается как часть последовательности.
Предполагается, что нормальные данные будут предсказаны в последовательности с большей вероятностью, чем выбросы. Однако подход является вычислительно дорогим. [7]
Anomaly Measure-dependent Feature Learning.
Теперь будем обучать модель φ(·) : X→ Z, оптимизируясь уже на специальную функцию теперь аномальности.
Конкретные подходы в этом семействе:
One-class Classification-based Measure. Предполагаем, что нормальные данные приходят из одного класса, который может быть описан одной моделью, когда как аномальный объект в этот класс на попадёт. Тут можно найти one-class SVM [10], Support Vector Data Description (SVDD) [11].
Clustering-based Measure. Классический подход детекции аномалий, где предполагается, что выбросы легко отделимы от кластеров в сформированном на обучающей выборке новом подпространстве [12].
End-to-end anomaly score learning
Из названия видим, что нейронная сеть будет теперь напрямую вычислять anomaly score.
Семейство таких пайплайнов можно описать следующим образом:
где τ (x; Θ) : X→ R нейронная сеть, выдающая сразу скоринговую величину.
Ranking Models. Один из разновидностей end-to-end подхода. Здесь нейронная сеть сортирует все объекты по некоторой величине, ассоциирующейся у модели со степенью аномальности. Self-trained deep ordinal regression model [13].
Softmax Models. В данных архитектурах модели обучаются, максимизируя функцию правдоподобия нормального объекта из входных данных. При этом предполагается, что выброс будет иметь низкую вероятность в качетсве события.
Deviation Networks (end-to-end pipeline) [1]
Как на одном из наиболее актуальных подходов остановимся отдельно на архитектуре, предложенной G. Pang для обнаружения выбросов в задаче, где предполагается наличие лишь небольшого набора размеченных аномальных данных и большого массива неразмеченных объектов. На рис.5 представлена архитектура модели.
Объяснение работы deviation loss function
где y = 1, если объект является аномальным, y = 0 иначе. При этом из функции потерь можно заметить, что в процессе оптимизации модель будет стараться приблизить значения anomaly score к референсному у нормальных объектах, тогда как для аномальных будет заставлять предсказательную сеть выдавать такие значения φ(x; Θ), чтобы dev(x) было положительным, а значит, будет устремлять его к «a» (заранее заданной достаточно большой положительной величиной). Тем самым модель обучится четко разделять аномальные и нормальные объекты.
Заключение
В качестве заключения стоит отметить, что для тех или иных условий, в которых предполагается решать задачу выявления аномальных объектов подходят совершенно разные архитектуру и идеи решения. В каждом из рассмотренных типов есть свои SOTA-подходы. Хотя за последние несколько лет всё больше и больше популярность набирают именно end-to-end алгоритмы.
Ссылки на литературу
[1] Deep Anomaly Detection with Deviation Networks. G. Pang
[2] Deep Learning for Anomaly Detection: A Review. G. Pang
[3] Emmanuel J Candès, Xiaodong Li, Yi Ma, and John Wright. 2011. Robust principal component analysis?
[4] Ping Li, Trevor J Hastie, and Kenneth W Church. 2006. Very sparse random projections.
[5] Alireza Makhzani and Brendan Frey. 2014. K-sparse autoencoders. In ICLR.
[6] Thomas Schlegl, Philipp Seeböck, Sebastian M Waldstein, Ursula Schmidt-Erfurth, and Georg Langs. 2017. Unsupervised anomaly detection with generative adversarial networks to guide marker discovery.
[7] Wen Liu, Weixin Luo, Dongze Lian, and Shenghua Gao. 2018. Future frame prediction for anomaly detection–a new baseline.
[8] Edwin M Knorr and Raymond T Ng. 1999. Finding intensional knowledge of distance-based outliers.[9] Fabrizio Angiulli and Clara Pizzuti. 2002. Fast outlier detection in high dimensional spaces.
[10] Bernhard Schölkopf, John C Platt, John Shawe-Taylor, Alex J Smola, and Robert C Williamson. 2001. Estimating the support of a high-dimensional distribution.
[11] David MJ Tax and Robert PW Duin. 2004. Support vector data description.
[12] Mathilde Caron, Piotr Bojanowski, Armand Joulin, and Matthijs Douze. 2018. Deep clustering for unsupervised learning of visual features.
[13] Guansong Pang, Cheng Yan, Chunhua Shen, Anton van den Hengel, and Xiao Bai. 2020. Self-trained Deep Ordinal Regression for End-to-End Video Anomaly Detection.
[14] Andrew Y Ng and Stuart J Russell. 2000. Algorithms for Inverse Reinforcement Learning.
Анализ малых данных
КвазиНаучный блог Александра Дьяконова
Поиск аномалий (Anomaly Detection)
В этом посте поговорим об одной важной проблеме обучения без учителя (Unsupervised Learning) – задаче поиска аномалий (Anomaly Detection). Интересно, что в русскоязычных учебных курсах об этой задаче часто забывают. Даже в русской версии страницы обучение без учителя нет упоминания об этой задаче, в английской, конечно же, есть.
Строго говоря, в анализе данных есть два направления, которые занимаются поиском аномалий: детектирование выбросов (Outlier Detection) и «новизны» (Novelty Detection). Как и выброс «новый объект» — это объект, который отличается по своим свойствам от объектов (обучающей) выборки. Но в отличие от выброса, его в самой выборке пока нет (он появится через некоторое время, и задача как раз и заключается в том, чтобы обнаружить его при появлении). Например, если вы анализируете замеры температуры и отбрасываете аномально большие или маленькие, то Вы боретесь с выбросами. А если Вы создаёте алгоритм, который для каждого нового замера оценивает, насколько он похож на прошлые, и выбрасывает аномальные — Вы «боретесь с новизной».
Выбросы являются следствием:
На рис. 1 видно, что шум (noise) — это выброс «в слабом смысле» (он может немного размывать границы класса/кластера). Нас же интересуют, прежде всего, выбросы «в сильном смысле», которые искажают эти границы.
Новизна, как правило, появляется в результате принципиально нового поведения объекта. Скажем, если наши объекты – описания работы системы, то после проникновения в неё вируса объекты становятся «новизной». Ещё пример – описания работы двигателя после поломки. Здесь важно понимать, что «новизна» называется новизной по той причине, что такие описания для нас абсолютно новые, а новые они потому, что мы не можем в обучающей выборке иметь информацию о всевозможных заражениях вирусами или всевозможных поломках. Формирование такой обучающей выборки трудозатратно и часто не имеет смысла. Зато можно набрать достаточно большую выборку примеров нормальной (штатной) работы системы или механизма.
Приложений здесь море:
Стоит отметить, что возможных постановок задач здесь тоже много. Например, задача Positive-Unlabeled Classification (PU learning) – это когда часть выбросов обозначена (класс 1), но в остальных объектах обучения (класс 0) также могут содержаться выбросы. Например, нам эксперт сказал, что оборудование давало сбой в такие-то моменты времени, но он мог заметить не все сбои.
Даже когда задачи обнаружения аномалий похожи на обычные задачи классификации, есть особенности, скажем дисбаланс классов (например, поломки оборудования относительно редки).
Аномалии бывают не только в табличных данных, они могут быть в графах, временных рядах и т.д.
Рис. 2. Пример выбросов во временном ряде.
Рис. 3. Пример выбросов в графах и последовательностях.
Функционалы качества в задачах детектирования аномалий используют примерно такие же, как и в задачах классификации: PR AUC, AUROC, здесь всё определяется контекстом задачи (заказчиком).
Методы обнаружения выбросов
1. Статистические тесты
Как правило, применяют для отдельных признаков и отлавливают экстремальные значения (Extreme-Value Analysis). Для этого используют, например, Z-value или Kurtosis measure.
Рис. 4. Пример выбросов.
Любой практик имеет какой-нибудь свой проверенный способ нахождения экстремальных значений для определённых типов данных. Многие методы визуализации, например ящик с усами, имеют встроенные средства для детектирования и показа таких экстремальных значений.
Важно понимать, что экстремальное значение и аномалия это разные понятия. Например, в небольшой выборке
значение 39 можно считать аномалией, хотя оно не является максимальным или минимальным. Также стоит отметить, что аномалия характеризуется, как правило, не только экстремальными значениями отдельных признаков (см. рис. 5)
Рис. 5. Пример выбросов в задаче с двумя признаками.
2. Модельные тесты
Идея очень простая – мы строим модель, которая описывает данные. Точки которые сильно отклоняются от модели (на которых модель сильно ошибается) и есть аномалии (см. рис. 2). При выборе модели мы можем учесть природу задачи, функционал качества и т.п.
Такие методы хороши для определения новизны, но хуже работают при поиске выбросов. Действительно, при настройке модели мы используем данные, в которых есть выбросы (и она под них «затачивается»).
Рис. 6. Применение SVD для нахождение выбросов в матрице
На рис. 6 показано применение модельного подхода. У нас есть матрица и требуется найти в ней выбросы. Мы используем неполное сингулярное разложение (SVD), чтобы найти матрицу небольшого ранга максимально похожую на нашу (для наглядности все числа округлены). Элементы, которые сильно отличаются от соответствующих элементов матрицы небольшого ранга, будем считать выбросами.
3. Итерационные методы
Методы, которые состоят из итераций, на каждой из которых удаляется группа «особо подозрительных объектов». Например, в n-мерном признаковом пространстве можно удалять выпуклую оболочку наших точек-объектов, считая её представителей выбросами. Как правило, методы этой группы достаточно трудоёмки.
Рис. 7. Выпуклые оболочки множества точек.
4. Метрические методы
Судя по числу публикаций, это самые популярные методы среди исследователей. В них постулируется существование некоторой метрики в пространстве объектов, которая и помогает найти аномалии. Интуитивно понятно, что у выброса мало соседей, а у типичной точки много. Поэтому хорошей мерой аномальности может служить, например «расстояние до k-го соседа» (см. метод Local Outlier Factor). Здесь используются специфические метрики, например расстояние Махаланобиса.
Рис. 8. Соседи нескольких элементов выборки, связь с 5м показана красным
5. Методы подмены задачи
Когда возникает новая задача, есть большой соблазн решить её старыми методами (ориентированными на уже известные задачи). Например, можно сделать кластеризацию, тогда маленькие кластеры, скорее всего, состоят из аномалий. Если у нас есть частичная информация об аномалиях (как в задаче PUC), то можно решить её как задачу классификации с классами 1 (размеченные аномалии) и 0 (все остальные объекты). Если бы класс 0 состоял только из нормальных объектов, то такое решение было бы совсем законным, иначе остаётся надеяться, что недетектированных аномалий в нём немного.
Рис. 9. Пример кластеризации на малый (красный) и большой (синий) кластер.
6. Методы машинного обучения
А что если воспринять задачу нахождения аномалий как новую задачу машинного обучения (отличную от классификации и кластеризации)?!
Самые популярные алгоритмы (есть реализация даже в scikit-learn) здесь:
Важные параметры реализации sklearn.svm.OneClassSVM:
Изолирующий лес (Isolation Forest) – это одна из вариаций идеи случайного леса. Как всегда: простая и надёжная.
Логика алгоритма простая: при описанном «случайном» способе построения деревьев выбросы будут попадать в листья на ранних этапах (на небольшой глубине дерева), т.е. выбросы проще «изолировать» (напомним, что дерево строится до тех пор, пока каждый объект не окажется в отдельном листе). Алгоритм хорошо отлавливает именно выбросы (см. рис. 12).
Рис. 12. Оценки изолирующего леса для одномерной выборки.
Важные параметры реализации sklearn.ensemble.IsolationForest
Эллипсоидальная аппроксимация данных — из названия понятно, что облако точек моделируется как внутренность эллипсоида. Метод хорошо работает только на одномодальных данных, а совсем хорошо – на нормально распределённых. Степень новизны здесь фактически определяется по расстоянию Махаланобиса.
7. Ансамбли алгоритмов
В методы решения задач обнаружения аномалий также проникла идея «один алгоритм хорошо, а сто лучше», поэтому часто строят много разных алгоритмов. Каждый из них даёт оценку аномальности и эти оценки потом «усредняют».
Поскольку ключевым моментов в реальных задачах обнаружения аномалий является выбор признаков, которые характеризуют те или иные отклонения от нормы, алгоритмы из ансамбля строят пытаясь угадать хорошие пространства. Здесь популярны:
Кстати, здесь «усреднение» не обязательно означает среднее арифметическое всех оценок, интуитивно понятно, что часто может сработать максимум (если какой-то алгоритм уверен в аномальности объекта, то скорее всего так оно и есть).
История из практики
В задачах поиска аномалий важно понимать, как работают алгоритмы поиска, и объяснить это заказчику. Например, когда автор последний раз участвовал в решении подобной задачи, заказчик хотел средство для детектирования поломок, но из-за природы модели получился алгоритм детектирования «неправильного функционирования оборудования», т.е. он давал сигнал не только в случае поломок, но и в случае некорректной эксплуатации прибора, а также при работе в очень редких режимах. Некоторые поломки (очень частые) он всё-таки пропускал, т.к. «они уже стали для прибора нормой». Понятно, что при наличии большой размеченной выборки таких проблем не возникало бы, но на практике оборудование работает не так долго, поломок тоже мало (и не все возможные случаются), а некоторые поломки могли не заметить или заметить с запозданием. Кроме того, некоторые поломки никак не отражаются на показаниях датчиков. Изначально качество очень расстроило заказчика, но когда ему объяснили, как работает алгоритм, заказчик сверился с данными испытаний и убедился, что алгоритм очень полезный, даже если не находит какие-то поломки: его можно использовать как верификатор «работает ли прибор в штатном режиме», а это самое главное.
П.С. Код для получения рис.10 можно взять здесь.