Поиск по сайту Поиск

Истина где-то рядом — ищем аномалии с Python. Часть 2: практика

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

Начнём с того, что визуально оценим набор данных и посмотрим, сможем ли мы найти аномалии. Файл Jupyter Notebook с нижеизложенным кодом можно найти здесь.

Для начала создадим синтетический набор данных, который будет содержать только два столбца:

— ФИО сотрудников организации (для 100 человек)

— их ежемесячная заработная плата (в долларах США) в диапазоне от 1000 до 2500.

Чтобы сгенерировать похожие на настоящие имена, мы будем использовать Python-библиотеку Faker, а для зарплаты подойдёт привычная numpy. После этого объединим созданные столбцы в Pandas DataFrame. 

Примечание: не пренебрегайте работой с фиктивными наборами данных, это действительно важный экспериментальный навык!

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

Теперь можно начать эксперименты.

Видеть значит верить: находим аномалии глазами

Подсказка: ящики с усами великолепны!

Как упоминалось в предыдущей статье, появление аномалий напрямую зависит от генерации самих данных. Рассмотрим немного базовой статистики (минимальное значение, максимальное, значение 1-го квартиля и т. д.) в виде ящика с усами (диаграммы размаха):

Образец ящика с усами

Мы получим:

https://paper-attachments.dropbox.com/s_1185AEC62427E23657579AF288686866FF5B3F65A0E36E86D1A293C6B0CCF4B4_1554276006076_download.png

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

Как насчёт гистограмм?

Результат:

https://paper-attachments.dropbox.com/s_1185AEC62427E23657579AF288686866FF5B3F65A0E36E86D1A293C6B0CCF4B4_1554276086683_download+1.png

На графике выше мы тоже видим отклоняющуюся ячейку. Ось Y даёт понять, что зарплата искажена только у двух сотрудников.

Какой же способ сразу подтвердит наличие аномалий в наборе данных? Давайте посмотрим на минимальное и максимальное значение столбца «Заработная плата» (Salary):

Получим:

Минимальное значение явно отклоняется от того, что было задано раньше (1000 долларов). Следовательно, это действительно аномалия. 

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

Кластерный подход для обнаружения аномалий

Мы выяснили, что кластеризация и поиск аномалий тесно связаны, хоть и служат разным целям. Но кластеризацию можно использовать для детектирования выбросов. В этом разделе мы рассмотрим аномалии в виде групп похожих объектов. Математически их схожесть измеряется такими функциями, как евклидово расстояние, манхэттенское расстояние и т. д. Евклидово расстояние — самое распространённое, поэтому остановимся на нём подробнее.

Очень короткая заметка о евклидовом расстоянии

Если в двумерном пространстве есть n точек (см. следующий рисунок) и их координаты обозначены (x_i, y_i), то евклидово расстояние между любыми двумя точками x1, y1 и x2, y2 равно:

https://paper-attachments.dropbox.com/s_1185AEC62427E23657579AF288686866FF5B3F65A0E36E86D1A293C6B0CCF4B4_1554546141896_image.png

Уравнение евклидова расстояния
https://paper-attachments.dropbox.com/s_1185AEC62427E23657579AF288686866FF5B3F65A0E36E86D1A293C6B0CCF4B4_1554298964709_Capture+1.PNG

График с точками на двумерной плоскости

Для кластеризации мы будем использовать метод k-средних. Начнём:

Теперь импортируем модуль kmeans из scipy.cluster.vq. SciPy (Scientific Python) — это библиотека для различных научных расчётов.  Применим kmeans к salary_raw:

Во фрагменте выше мы указали в kmeans данные о зарплате и количество кластеров, по которым хотим сгруппировать точки. centroids — это центроиды, сгенерированные kmeans, а avg_distance — усреднённое евклидово расстояние между ними и точками. Давайте извлечём наши кластеры с помощью метода vq(). Его аргументы это:

— точки данных

— центроид, сгенерированный алгоритмом кластеризации.

Метод возвращает группы точек (кластеры) и расстояния между точками и ближайшими кластерами.

https://paper-attachments.dropbox.com/s_1185AEC62427E23657579AF288686866FF5B3F65A0E36E86D1A293C6B0CCF4B4_1554276804886_download+2.png

Теперь вы точно видите аномалии. Итак, несколько моментов, которые необходимо учитывать перед обучением модели:

  1. Тщательно изучите данные — взгляните на каждый признак в наборе, соберите статистику.
  2. Постройте несколько полезных графиков (как показано выше), так вам будет легче заметить отклонения.
  3. Посмотрите, как признаки связаны друг с другом. Это поможет выбрать наиболее значимые из них и отказаться от тех, что не влияют на целевую переменную (не коррелируют с ней). 

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

А почему бы и нет?

Обнаружение аномалий как проблема классификации

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

Снова взглянем на датасет:

https://blog.floydhub.com/content/images/2019/04/image-1.png

Теперь мы решаем задачу бинарной классификации. Будем искать выбросы, основываясь на подходе близости (proximity-based anomaly detection). Основная идея в том, что близость аномальной точки к её соседним точкам сильно отличается от близости других точек к их соседям. Если вам ничего не понятно, не пугайтесь — на наглядном примере всё станет ясно.

Для этого мы применим метод k-ближайших соседей и Python-библиотеку PyOD, специально предназначенную для детектирования выбросов.

Столбец “Person” для модели совершенно бесполезен, поскольку служит лишь идентификатором. Подготовим обучающую выборку:

Аргументы, переданные в KNN():

contamination: количество аномалий в данных (в процентах), в нашем случае 2/100

n_neighbors: число соседей, упитывающихся при измерении близости 

Теперь получим прогнозируемые метки и оценку аномалий. Чем выше оценка, тем хуже данные. Для этого применим удобные функции PyOD:

Попробуем оценить KNN() относительно обучающей выборки с помощью функции evaluate_print():

Получим:

Видим, что KNN() достаточно хорошо работает на обучающих данных. Он выдаёт три метрики и их оценки:

ROC

— точность

—  доверительную оценку.

Примечание: при обнаружении аномалий всегда следует учитывать эти оценки, поскольку они дают наиболее полное представление об эффективности модели.

У нас нет тестовой выборки, но мы можем сгенерировать примерное значение зарплаты:

Давайте проверим, может ли модель пометить это значение как выброс:

Вывод должен быть: array([1])

Видим, что модель не ошиблась. Проверим, как она работает с нормальными данными:

Вывод: array([0])

Модель отметила значение как обычную точку данных. 

На этом мы завершаем исследование аномалий и переходим к заключению.

Проблемы и дальнейшие исследования

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

Эффективное разделение данных на «нормальные» и «аномальные»: иногда трудно найти границу, которая будет служить индикатором выбросов, особенно в задачах из совершенно разных предметных областей. Придётся либо тратить много времени на изучение данных, либо консультироваться с соответствующими специалистами.

Понимание разницы между шумом и аномалиями: если принять выбросы за шум или наоборот, то можно изменить весь ход процесса обнаружения аномалий, поэтому следует уделять внимание этому вопросу.

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

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

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

Другие сложные методы: здесь мы рассматривали только поиск точечных аномалий. Но есть ряд алгоритмов для обнаружения контекстуальных и коллективных аномалий. Более подробную информацию о них можно найти в книге “Data Mining. - Concepts and Techniques (3rd Edition)”.

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

С оригинальной статьёй можно ознакомиться в блоге floydhub.com.

7 советов для работы с небольшими данными

7 советов для работы с небольшими данными

В современном мире считается, что Big Data — ключ к созданию успешных проектов машинного обучения. Но проблема в том, что...
Read More
Квантовые нейронные сети на процессорах будущего

Квантовые нейронные сети на процессорах будущего

Законы квантовой механики в теории позволяют создать новый тип вычислительных машин, способных решать сверхпроизводительные задачи, недоступные даже самым мощным современным...
Read More
Стэнфордский курс: лекция 7. Обучение нейросетей, часть 2

Стэнфордский курс: лекция 7. Обучение нейросетей, часть 2

В шестой лекции мы начали рассказывать про обучение нейросетей: выяснили, как выбрать функцию активации, подготавливать данные, настраивать параметры и следить...
Read More
Нейросеть распознаёт узор вязания по фото

Нейросеть распознаёт узор вязания по фото

Автоматизированным производством сегодня уже никого не удивишь. Но мы попробуем. Один из наиболее необычных примеров автоматических устройств — вязальные машины,...
Read More
Бариста, учитель и работник типографии: кем были сотрудники REG.RU до того, как стали айтишниками

Бариста, учитель и работник типографии: кем были сотрудники REG.RU до того, как стали айтишниками

Сегодня, 30 сентября, День Интернета в России. В честь этой даты мы расскажем семь историй о том, как сотрудники REG.RU...
Read More
Чек-лист, который заряжен на защиту домена

Чек-лист, который заряжен на защиту домена

Время от времени мы сталкиваемся со случаями, когда мошенники уводят домены наших клиентов. Происходит это по самым разным причинам: от...
Read More
Методы распознавания радужной оболочки глаз. Часть 1

Методы распознавания радужной оболочки глаз. Часть 1

Не так давно идентификация людей по радужной оболочке глаз казалась фантастической технологией, использующейся только для защиты суперсекретных военных и правительственных...
Read More
Стэнфордский курс: лекция 6. Обучение нейросетей, часть 1

Стэнфордский курс: лекция 6. Обучение нейросетей, часть 1

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

Три слова, которые поймут только айтишники

Если вы не разработчик, но работаете в IT-компании, или в вашем окружении есть программисты, то, скорее всего, часто слышите странные...
Read More
Customer development: почему при выборе идеи нужно учитывать мнение клиентов

Customer development: почему при выборе идеи нужно учитывать мнение клиентов

Вместе с менеджером по продуктам REG.RU Никитой Атучиным разбираем, почему MVP — не всегда хорошее решение для старта бизнеса. Если вы...
Read More