Алгоритмы поиска аномалий HBOS и ECOD

Привет, Хабр! Меня зовут Михаил Васильев, я старший специалист по машинному обучению в компании Makves (входит в группу компаний «Гарда»). По работе мне часто приходится заниматься поиском аномалий в данных, однако я заметил, что в русскоязычном интернете этой задаче посвящено очень мало материалов. В частности, я не нашел хорошего разбора различных алгоритмов поиска аномалий, где были бы описаны их плюсы и минусы.

В статье хочу частично исправить этот недочет и разобрать алгоритмы HBOS и ECOD, а также обсудить особенности их реализации в популярной библиотеке PyOD.

Рассмотрим:

  • аномалии,

  • метод трех сигм,

  • алгоритм HBOS,

  • алгоритм ECOD.

Аномалии

Если отталкиваться от определения, данного в книге D. Hawkins. Identification of Outliers, аномалии — это данные, которые настолько отличаются от других (нормальных) данных, что кажется, что они получены из иного источника. Например, поведение хакера в корпоративной сети будет сильно отличаться от поведения простых работников компании. Обращение мошенника с деньгами на скомпрометированном счете будет сильно отличаться от действий нормального пользователя. Раннее обнаружение подобных аномалий крайне важно для предотвращения финансовых и репутационных потерь.

Часто возникает соблазн представить поиск аномалий как задачу бинарной классификации: достаточно просто собрать данные и разметить в них примеры аномалий. Однако тут мы сталкиваемся с целым рядом проблем.

Во-первых, аномалии по природе своей довольно редки. Решение задачи с сильно несбалансированными классами требует особых подходов, например, генерации синтетических данных, under-sampling или over-sampling.

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

И в-третьих, аномалии могут видоизменяться. Даже если мы обучим модель-классификатор обнаруживать действия хакеров на определенном ряде примеров, вскоре шаблоны их поведения могут измениться. И останется бесполезная модель, на обучение которой было потрачено много сил, времени и ресурсов.

Именно поэтому задача поиска аномалий часто решается через методы машинного обучения без учителя (unsupervised learning). В некоторых случаях задачу поиска аномалий удобно свести к задаче определения степени аномальности (anomaly score). Уже затем мы сможем отобрать, например, 5% самых аномальных записей для анализа, либо подобрать какое-либо пороговое значение, при превышении которого запись будет считаться аномалией.

Рассмотрим несколько алгоритмов, которые позволят нам получить anomaly score на не размеченных данных.

Метод трех сигм

Предположим, мы работаем с нормально распределенными одномерными данными. Для расчета степени аномальности можно использовать количество стандартных отклонений от среднего. В этом случае нам помогут хорошо известные свойства нормального распределения, например то, что 99,7% данных лежат в пределах трех стандартных отклонений от среднего. Просто, понятно, легко реализуемо. Эмпирически подбираем пороговое значение и можно работать.

Пример данных, взятых из нормального распределения. Среднее и три сигмы показаны пунктиром
Пример данных, взятых из нормального распределения. Среднее и три сигмы показаны пунктиром

Алгоритм HBOS

Однако ситуация меняется, если наше распределение не похоже на нормальное. Для примера рассмотрим гистограмму ниже.

Гистограмма «пионеров и пенсионеров», среднее показано пунктиром
Гистограмма «пионеров и пенсионеров», среднее показано пунктиром

Гистограмма примерно отображает распределение возрастов сотрудников на моей первой работе. Там было много сотрудников предпенсионного возраста и «вчерашних» студентов, но работников среднего возраста почти не было. На гистограмме видно, что к аномалиям можно отнести сотрудников возрастной категории от 35 до 50 лет (их очень мало), но метод трех сигм в данной ситуации бесполезен — нормальные данные (возрастные категории от 20 до 35 и от 50 до 70 лет) получат большую степень аномальности, так как они лежат дальше от среднего значения (на гистограмме показано пунктирной линией).

Что же делать? Давайте попробуем пойти простым путем. На нашей гистограмме самые высокие столбцы соответствуют нормальным данным, а низкие — аномалиям. Давайте представим гистограмму в виде таблицы, в первой колонке запишем диапазоны столбцов (их еще называют бины), а во второй — количество сотрудников, попадающих в диапазон.

Диапазон

Количество сотрудников

(20,4; 25,4]

95

(25,4; 30,3]

6

(30,3; 35,3]

3

(35,3; 40,3]

1

(40,3; 45,3]

0

(45,3; 50,3]

2

(50,3; 55,2]

26

(55,2; 60,2]

83

(60,2; 65,2]

70

(65,2; 70,2]

19

Затем перейдем от абсолютных значений к вероятностям. В эталонной python Python-реализации в библиотеке pyod pyOD для этого рассчитывается плотность вероятности. Чтобы ее получить, мы разделим количество сотрудников в каждом бине на общее количество сотрудников и на ширину бина.

Диапазон

Количество сотрудников

Плотность вероятности

(20,4; 25,4]

95

95 / 305 / 5,0 = 0,063

(25,4; 30,3]

6

6 / 305 / 5,0 = 0,004

(30,3; 35,3]

3

3 / 305 / 5,0 = 0,002

(35,3; 40,3]

1

1 / 305 / 5,0 = 0,001

(40,3; 45,3]

0

0 / 305 / 5,0 = 0,000

(45,3; 50,3]

2

2 / 305 / 5,0 = 0,001

(50,3; 55,2]

26

26 / 305 / 5,0 = 0,017

(55,2; 60,2]

83

83 / 305 / 5,0 = 0,055

(60,2; 65,2]

70

70 / 305 / 5,0 = 0,046

(65,2; 70,2]

19

19 / 305 / 5,0 = 0,013

Мы получили вероятности, с ними работать намного приятнее. Тут стоит учесть, что наши данные скорее всего многомерны: помимо возраста мы можем знать, например, данные о зарплате или трудовом стаже сотрудника. Авторы оригинальной статьи предлагают упростить вычисления и сделать предположение, что признаки не зависят друг от друга. В самом деле, вероятность двух независимых событий рассчитывается как произведения вероятностей каждого события. Мы могли бы просто перемножить полученные значения для каждого из признаков, однако в этом случае легко столкнуться с тем, что при перемножении очень маленьких чисел мы рискуем выйти за пределы точности чисел с плавающей запятой. Чтобы обойти потенциальную проблему, применим популярный математический трюк. Воспользуемся следующим свойством логарифма: log (xy) = log (x) + log (y). Заменим произведение вероятностей на сумму логарифмов.

Диапазон

Количество сотрудников

Плотность вероятности

Логарифм

(20,4; 25,4]

95

0,063

log (0,063) + … = -2,621

(25,4; 30,3]

6

0,004

log (0,004) + … = -3,266

(30,3; 35,3]

3

0,002

log (0,002) + … = -3,294

(35,3; 40,3]

1

0,001

log (0,001) + … = -3,312

(40,3; 45,3]

0

0,000

log (0,000) + … = -3,322

(45,3; 50,3]

2

0,001

log (0,001) + … = -3,303

(50,3; 55,2]

26

0,017

log (0,017) + … = -3,094

(55,2; 60,2]

83

0,055

log (0,055) + … = -2,693

(60,2; 65,2]

70

0,046

log (0,046) + … = -2,775

(65,2; 70,2]

19

0,013

log (0,013) + … = -3,152

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

Диапазон

Количество сотрудников

Плотность вероятности

Логарифм

Степень аномальности

(20,4; 25,4]

95

0,063

-2,621

2,621

(25,4; 30,3]

6

0,004

-3,266

3,266

(30,3; 35,3]

3

0,002

-3,294

3,294

(35,3; 40,3]

1

0,001

-3,312

3,312

(40,3; 45,3]

0

0,000

-3,322

3,322

(45,3; 50,3]

2

0,001

-3,303

3,303

(50,3; 55,2]

26

0,017

-3,094

3,094

(55,2; 60,2]

83

0,055

-2,693

2,693

(60,2; 65,2]

70

0,046

-2,775

2,775

(65,2; 70,2]

19

0,013

-3,152

3,152

Нанесем наш результат на исходную гистограмму.

Аномальные данные отображаются в голубоватых оттенках фиолетового
Аномальные данные отображаются в голубоватых оттенках фиолетового

Получилось ровно то, что нам нужно: бины с аномальными данными получают высокую степень аномальности, их легко отличить от бинов с нормальными данными. Мы только что разобрали алгоритм HBOS (Histogram Based Outlier Selection). Этот метод быстрый и легко реализуется с нуля, хотя имеет и свой недостаток: результаты его работы сильно зависят от выбора числа бинов в изначальной гистограмме. Если мы разобьем данные на слишком много бинов, эффективность метода упадет, так как нормальные данные будут размечаться с более высокой степенью аномальности. А если использовать слишком мало бинов, то аномальные данные будут теряться в широких бинах нормальных данных.

Алгоритм ECOD

Существует способ отказаться от необходимости выбора числа бинов. Для этого перейдем от использования гистограммы к функции распределения.

Функция распределения — это статистический инструмент, который помогает понять, как распределены значения в наборе данных. Она показывает вероятность того, что случайно выбранное значение будет меньше или равно определенному уровню. Например, если у вас есть данные о ежедневных продажах в магазине, функция распределения может показать, какова вероятность того, что в случайно выбранный день объем продаж будет меньше 1 000 единиц товара.

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

Чтобы построить выборочную ЭФР, нужно выполнить следующие шаги:

1.          Сортируем данные: располагаем все значения по порядку.

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

Нормальное распределение. Гистограмма (сверху) и выборочная эмпирическая функция распределения (снизу)
Нормальное распределение. Гистограмма (сверху) и выборочная эмпирическая функция распределения (снизу)

Разберем на примере с данными о ежедневных продажах. На верхнем графике представлена гистограмма распределения продаж за день. Она показывает, как часто встречаются различные уровни продаж. На нижнем графике изображена выборочная эмпирическая функция распределения. Она показывает, какая доля дней имеет продажи меньше или равные определенному значению. Например, если посмотреть на точку, где продажи равны 1000 единицам, можно увидеть, что примерно 50% дней имеют продажи меньше или равные этому значению. Таким образом, ЭФР позволяет анализировать реальные данные без необходимости знать теоретическое распределение.

Теперь попробуем использовать значения выборочной эмпирической функции распределения для поиска аномалий. Для этого рассмотрим двухмерные данные, например, с признаками, которые измеряются в «удавах» и «попугаях».

Данные с аномалиями
Данные с аномалиями

Нормальные данные сосредоточены в нижнем правом углу (от 2 до 4 попугаев и от -4 до -2 удавов), а вокруг них довольно много шума и аномалий. Построим гистограмму и график ЭФР для каждого из признаков по отдельности.

Графики попугаев
Графики попугаев

На нижнем графике наглядно видно, что значительной части аномалий (всему левому «хвосту») соответствуют низкие значения ЭФР. У нормальных данных значения лежат в диапазоне примерно от 0,2 до 0,9. Теперь посмотрим на удавов.

Графики удавов
Графики удавов

Здесь с нормальными данными ситуация аналогична (в диапазоне примерно от 0,1 до 0,8), а вот большая часть аномалий имеет высокие значения ЭФР.

Теперь для каждой записи рассчитаем, во-первых, значение ЭФР, и во-вторых, значение 1 ‒ ЭФР (ведь ЭФР всегда лежит в диапазоне от 0 до 1, так что для аномалий одно из этих значений точно будет очень низким). В таблице ниже представлены расчеты для части записей по признаку «удавы».

Удавы

ЭФР

1 ‒ ЭФР

-2,87

0,48

0,52

-2,83

0,51

0,50

-3,34

0,26

0,75

-2,88

0,48

0,53

-0,55

0,85

0,16

1,53

0,90

0,11

1,01

0,89

0,12

4,81

0,96

0,05

Затем рассчитаем отрицательные значения логарифмов ЭФР и 1 ‒ ЭФР (в оригинальной статье учитывается еще и скошенность распределения, но для простоты объяснения мы опустим этот момент). Сложим их с отрицательными значениями логарифмов по другим признакам (по попугаям).

Удавы

ЭФР

1 ‒ ЭФР

‒ln (ЭФР)

‒ln (1 ‒ ЭФР)

-2,87

0,48

0,52

0,73 + …

0,64 + …

-2,83

0,51

0,50

0,67 + …

0,70 + …

-3,34

0,26

0,75

1,37 + …

0,29 + …

-2,88

0,48

0,53

0,74 + …

0,63 + …

-0,55

0,85

0,16

0,16 + …

1,86 + …

1,53

0,90

0,11

0,11 + …

2,21 + …

1,01

0,89

0,12

0,12 + …

2,16 + …

4,81

0,96

0,05

0,05 + …

3,00 + …

Теперь возьмем максимальное из отрицательных значений логарифмов для каждой записи и будем использовать его в качестве степени аномальности (как мы это делали в алгоритме HBOS).

Удавы

ЭФР

1 ‒ ЭФР

‒ln (ЭФР)

‒ln (1 ‒ ЭФР)

max (‒ln (ЭФР), ‒ln (1 ‒ ЭФР))

-2,87

0,48

0,52

1,03

1,99

1,99

-2,83

0,51

0,50

1,34

1,42

1,42

-3,34

0,26

0,75

1,61

1,78

1,78

-2,88

0,48

0,53

0,84

2,99

2,99

-0,55

0,85

0,16

2,13

2,01

2,13

1,53

0,90

0,11

3,62

2,23

3,62

1,01

0,89

0,12

4,32

2,17

4,32

4,81

0,96

0,05

1,39

3,29

3,29

Все вычисления готовы, посмотрим на наши данные, размеченные с помощью алгоритма ECOD.

Нормальные  данные отображаются в более темных оттенках фиолетовогj
Нормальные  данные отображаются в более темных оттенках фиолетовогj

В этой разметке четко выделился кластер нормальных данных, у записей на удалении от кластера степень аномальности выше. И для работы алгоритма не требуется подбирать гиперпараметры (например, размер бина, как в случае с HBOS)!

Мы рассмотрели работу двух важных алгоритмов для поиска аномалий: HBOS и ECOD. Оба алгоритма обладают несколькими преимуществами:

1.          Простота понимания и реализации.

2.          Высокая скорость работы.

3.          Объяснимость.

Сама архитектура обоих алгоритмов позволяет нам легко (даже без использования SHAP values) интерпретировать результаты их работы.

К недостаткам можно отнести тот факт, что мы делаем предположение о независимости признаков. Но для задачи поиска аномалий это условие часто не выполняется. Аномальна ли погода в 29° в Москве? Нет. Аномальная ли эта погода в Москве в ноябре? Да.

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

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

1.      Charu C. Aggarwal. Outlier Analysis, Second Edition (Springer, 2017, ISBN 978–3–319–47578–3);

2.      Kishan G. Mehrotra, Chilukuri K. Mohan, HuaMing Huang. Anomaly Detection Principles and Algorithms (Springer, 2017, ISBN 978–3–319–67526–8);

3.      Jiawei Han, Micheline Kamber, Jian Pei. Chapter 12. Outlier Detection // Data Mining Concepts and Techniques, Third Edition (Morgan Kaufmann, 2012, ISBN 978–0–12–381479–1).

© Habrahabr.ru