поиск аномалий машинное обучение

Детектирование аномалий с помощью автоенкодеров на Python

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

Какой датасет выбрать?

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

Рассмотрим пример работы функции. Создадим нормальное распределение с μ = 0.3 и σ = 0.05:

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

Объявим параметры нашего датасета:

И функции для генерирования примеров — нормальных и аномальных. Нормальными будут считаться распределения с одним максимумом, аномальными — с двумя:

Так выглядит нормальный пример:

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

Создадим массивы с признаками и метками:

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

Модели

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

One class SVM

OneClassSVM позволяет задать параметр nu — долю аномальных объектов в выборке.

Делаем предсказания на тестовом наборе:

Ну, такое. Довольно низкий f1-score свидетельствует о том, что модель плохо справляется с задачей.

Isolation forest

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

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

Classification report? — Classification report!

RandomForestClassifier

Конечно, всегда стоит проверять какой-нибудь простой вариант типа «а вдруг задача классификации окажется посильной для случайного леса?» Что ж, попробуем:

Autoencoder

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

Принцип работы автоенкодера состоит в том, что модель пытается сначала «сжать» данные, а потом восстановить их. Она состоит из 2 частей: Encoder’а и Decoder’а, которые занимаются сжатием и расшифровкой соответственно.

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.
Изображение взято из статьи

Чтобы создать эффект «сжатия» данных, надо уменьшить скрытые слои, заставив их обрабатывать большее количество информации меньшим количеством нейронов.

Как этот эффект поможет нам? Теория информации говорит о том, что чем более вероятно событие, тем меньшее количество информации потребуется, чтобы описать это событие. Вспомним, что у нас всего лишь 9% аномалий и 91% нормальных объектов. Тогда для хранения информации об обычных объектах потребуется меньше информации, чем для запоминания аномальных. Но тогда, если мы подберем правильные параметры нейронной сети, то она сможет запоминать и восстанавливать только обычные объекты: на аномальные ей просто не будет хватать обобщающей способности.

Поэтому восстановленные моделью данные будут значительно отличаться от исходных.

Модель напишем на PyTorch, поэтому импортируем нужные модули:

Задаем гиперпараметры модели:

Очень важная часть. Тренировочный датасет должен состоять только из обычных объектов, потому что если модель увидит аномальные, то она может «подстроиться» под их восстановление и мы не сможем найти значительные отличия в исходных и восстановленных данных. Конечно, когда гиперпараметры модели (количество нейронов в скрытых слоях, learning rate, размер батча) подобраны правильно, то шанс неудачи понижается, но лучше перестраховаться.

Моделька. Скрытый слой будет иметь размер 4 нейрона, чтобы сымитировать неоптимальные параметры модели (для обычных примеров нам достаточно 2 нейронов: один для задания μ, другой — для σ, так мы полностью опишем распределение; но вот 4 нейрона могут восстановить распределение с двумя максимумами, как в наших аномальных примерах).

Чтобы как-то сравнивать loss’ы на нормальных и аномальных примерах, зададим функцию, строящую boxplot’ы ошибок:

На необученной модели функция выдает следующий результат:

поиск аномалий машинное обучение. zdbkvdiaq0ogs63d8w2wvrzkgey. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-zdbkvdiaq0ogs63d8w2wvrzkgey. картинка поиск аномалий машинное обучение. картинка zdbkvdiaq0ogs63d8w2wvrzkgey.

поиск аномалий машинное обучение. . поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-. картинка поиск аномалий машинное обучение. картинка .
Эпоха 50

поиск аномалий машинное обучение. dozabo7dq8ffd 5ahaoe4h29tka. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-dozabo7dq8ffd 5ahaoe4h29tka. картинка поиск аномалий машинное обучение. картинка dozabo7dq8ffd 5ahaoe4h29tka.
Эпоха 100

Видим, что ошибки на аномальных и нормальных классах отличаются достаточно сильно. Сравним, как выглядят реальные и восстановленные данные:

Как модель отработает на нормальном примере:

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

Difference score

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

Как это происходит? При обучении автоенкодер стремится минимизировать ошибку на обучающей выборке. Поэтому difference_score на ней будет очень низок, и случайный лес (вторая модель) будет думать, что нужно поставить низкий порог значений, чтобы сдетектировать аномалию. Но когда мы начнем тестировать валидационную выборку, может выясниться, что средний уровень difference_score на неаномальных объектах выше, чем при обучении (потому что автоенкодер не видел такие объекты при обучении). И случайный лес не сможет адекватно обнаружить аномалии.

Оценим модель на валидационной выборке:

Уже лучше. Посмотрим на наши данные:

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

А что происходит с самими скорами? Нераспознанные аномалии:

Источник

Машинное обучение: анализ временных рядов Azure Machine Learning для поиска аномалий

Обнаружение аномалий — одна из важнейших функций для решений в области «интернета вещей» (IoT), которые собирают и анализируют временные изменения в потоке данных от различных датчиков. Во многих случаях поток данных со временем не претерпевает значительных изменений. Однако если они появляются, это чаще всего означает, что в системе возникла аномалия, способная нарушить её работу. В этой статье я расскажу, как использовать модуль Time Series Anomaly Detection сервиса машинного обучения Azure Machine Learning для определения аномальных показателей датчиков.

поиск аномалий машинное обучение. caq ncdfb3 f1ticvjeu4ytc4v8. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-caq ncdfb3 f1ticvjeu4ytc4v8. картинка поиск аномалий машинное обучение. картинка caq ncdfb3 f1ticvjeu4ytc4v8.

Для раскрытия темы я расширю функционал приложения RemoteCamera Universal Windows Platform (UWP), разработанного мною к предыдущей статье, и добавлю список, в котором будут отображаться аномальные значения. Приложение RemoteCamera получает изображение с веб-камеры и вычисляет его яркость, которая при условии неизменности сцены в кадре колеблется вокруг определённых значений. Яркость легко изменить, например, прикрыв камеру рукой, что приведёт к заметному отклонению в потоке данных. Это помогает получить хорошую выборку для обнаружения аномалий во временном ряду.

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

Поиск аномалий

Согласно недавней статье Джеймса Маккефри, стандартный метод обнаружения аномалий основан на регрессии временного ряда. Наложив модель на данные, вы можете спрогнозировать тенденции, а затем проверить, все ли показатели соответствуют им. Для этого нужно сравнить спрогнозированные и фактические показатели. Значительная разница укажет на отклонение или аномалию.

Сначала я покажу, как находить такие отклонения, анализируя z-оценки. Чем эта оценка больше, тем выше вероятность того, что в потоке значений есть отклонение. Чтобы найти аномалии, нужно определить границы z-оценок, принимаемых за нормальные. Все z-оценки, выходящие за заданные пределы, будут считаться аномальными. Следует принимать во внимание, что из-за фиксированного порога, задаваемого в этом сценарии, возможны многочисленные ложные срабатывания. Чтобы уменьшить их число, применяют более сложные алгоритмы. В нашем случае, модуль Azure Time Series Anomaly Detection основан на перестановочных мартингалах, анализирующих, может ли ряд данных быть произвольно реорганизован без потери вероятности обнаружения определённого значения. Проще говоря, может ли каждое значение быть обнаружено в наборе данных с равной вероятностью. Коммутативный набор данных отличается низким коэффициентом аномалий. Если коммутативность нарушена, коэффициент аномалий растёт, указывая на нестандартные значения.

В этой статье я расскажу, как создавать такие алгоритмы машинного обучения. Я буду использовать решение Microsoft Azure Machine Learning Studio. Об этом продукте также рассказывал Джеймс Маккефри в сентябре 2014 года. Я расширю тему этой статьи и продемонстрирую эксперименты с машинным обучением. Кроме того, я покажу, как развернуть полученное решение в виде веб-службы, а затем — как использовать эту службу в приложении RemoteCamera.

Обучение с использованием набора данных

Сначала расширим приложение RemoteCamera, добавив вкладку, в которой можно собирать данные для обучения, а также включать или выключать режим обнаружения аномалий при помощи флажка.

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

Кнопка Acquire training dataset становится активной, если запустить предпросмотр изображения с камеры (при помощи кнопок управления на главной вкладке). При нажатии этой кнопки приложение начинает сбор данных для обучения. Этот процесс проходит в фоновом режиме, его ход сопровождается круговой анимацией. В итоге будет создан набор данных для обучения, состоящий из 100 точек данных. Каждая из них будет представлена экземпляром структуры BrightnessDataPoint:

Структура BrightnessDataPoint сохраняет значение яркости, а также время, в которое оно было зафиксировано. Затем набор таких значений экспортируется в файл BrightnessData.csv, который выглядит следующим образом:

Затем в текстовом поле отобразится точное расположение набора данных для обучения. Я использую значения, разделённые запятыми (файл CSV). Их легко загрузить в Machine Learning Studio.

Чтобы реализовать этот функционал, я написал два класса: BrightnessFileStorage и AnomalyDetector. Первый класс BrightnessFileStorage определяется файлом BrightnessFileStorage.cs во вложенной папке AnomalyDetection сопроводительного кода. Класс BrightnessFileStorage сохраняет набор объектов BrightnessDataPoint в файл CSV с использованием класса DataWriter.

Второй класс AnomalyDetector обрабатывает логику, относящуюся к обнаружению аномалий. В частности, он включает публичный метод Add-TrainingValue, который вызывается сразу после вычисления яркости изображения (см. обработчик событий ImageProcessor_ProcessingDone в файле MainPage.xaml.cs в сопроводительном коде). AddTrainingValue работает следующим образом. Сначала я создаю экземпляр BrightnessDataPoint, который затем добавляется в набор. Когда набор насчитывает 100 элементов, я сохраняю его в файл CSV. Затем я запускаю событие TrainingDataReady, которое обрабатывается в MainPage. Цель — прервать сбор данных для обучения и отобразить в интерфейсе пользователя местонахождение файла:

Расположение набора данных для обучения будет отображено в текстовом поле, откуда его можно легко скопировать, вставить в Проводник Windows и просмотреть полученные данные.

Анализ z-оценок

После получения набора данных для обучения я подготовлю первый эксперимент в Machine Learning Studio согласно инструкциям, описанным в статье Джеймса Маккефри в 2014 году. Для начала я загружаю файл BrightnessData.csv, затем планирую эксперимент с использованием визуального конструктора. Короче говоря, все компоненты находятся в меню в левой части окна Machine Learning Studio. Чтобы разместить элемент на плане вашего эксперимента, просто перетащите его в область эксперимента (это центральная часть окна Machine Learning Studio). У каждого компонента свои входные и выходные данные. Вам нужно соединить совместимые узлы, чтобы контролировать потоки данных между модулями. У компонентов могут быть дополнительные настройки, которые можно задать в окне свойств (в правой части окна Machine Learning Studio).

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

Алгоритм машинного обучения, изображённый выше, может работать в двух режимах: эксперимент и веб-служба. Различие лишь во входных данных. В режиме эксперимента в их роли выступает загруженный набор данных для обучения (BrightnessData), а в режиме веб-службы — её собственные входные данные. Вне зависимости от режима, входные данные преобразовываются в набор данных, после чего значения столбца яркости нормализуются с помощью преобразования в z-оценки. В ходе этого преобразования значения яркости пересчитываются в z-оценки, которые показывают их разброс относительно среднего значения. Разброс измеряется в среднеквадратичных отклонениях. Чем значительнее этот разброс, тем выше вероятность того, что текущее значение является аномальным. Я применяю нормализацию z-оценок, поскольку зачастую базовый или нормальный уровень яркости зависит от того, что фиксирует камера. Таким образом, преобразование в z-оценку обеспечивает корректный уровень яркости, когда нормализация близка к 0. Необработанные значения яркости различаются в примерном диапазоне от 40 до 150. После нормализации все значения яркости укладываются в пределы примерно от –4.0 до +4.0. Следовательно, чтобы найти аномальные значения, мне нужно лишь применить пороговый фильтр. Я применяю пороговый фильтр OutOfRange в Azure Machine Learning с нижним порогом –2 и верхним 1.5. Я выбрал эти значения на основе графика z-оценок и задал их в панели свойств порогового фильтра в Machine Learning Studio.

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

После указания порога набор данных представляет собой столбец данных логического типа, где указывается, находится ли в конкретный момент точка вне заданного диапазона. Чтобы дополнить эту информацию фактическими значениями яркости, которые были определены как аномальные, я совмещаю этот столбец с первоначальным набором данных, а затем разбиваю полученный набор на два подмножества. Одно содержит только аномальные значения, второе — стандартные. Перед разбивкой я меняю тип данных в столбце, поскольку модуль Split Data не поддерживает логические значения. После этого в результате эксперимента выдается первое подмножество. В случае с веб-службой, этот результат передаётся клиенту. Чтобы просмотреть значения какого-либо набора данных, нужно использовать опцию Results dataset | Visualize из контекстного меню набора данных в Machine Learning Studio. Эта опция будет доступна, если вы уже запускали данный эксперимент.

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

Анализ временных рядов в машинном обучении

А теперь научимся применять модуль Azure Time Series Anomaly Detection (ATSAD) для определения аномалий. Как показано ниже, процесс этого эксперимента напоминает предыдущий. Первоначальный набор данных нормализуется преобразованием в z-оценки и передаётся в модуль ATSAD (он находится в узле Time Series в Machine Learning Studio). Для этого необходимо настроить несколько входных параметров в окне свойств (bit.ly/2xUGTg2). Сначала нужно указать столбцы данных и времени, затем настроить тип мартингала. В нашем случае я буду использовать мартингал Power. Станет доступным ещё одно текстовое поле — Epsilon, где можно ввести любое значение чувствительности детектора в диапазоне от 0 до 1. Затем нужно настроить три параметра функции определения странности значений:

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

Далее нужно задать максимальное количество значений мартингала и странности в журнале. Можно ввести любое целое число от 10 до 1000. Методом проб и ошибок я остановился на следующих настройках детектора:

Запросив визуализацию выходных данных модуля ATSAD, можно увидеть, что к набору входных данных добавляется два столбца: коэффициент аномальности, измеряющий отклонения, и индикатор предупреждения с двоичным значением (0 или 1), указывающим на аномальность значения. На основании показаний второго индикатора я разбиваю набор данных на два подмножества: стандартные и аномальные значения. В результате эксперимента выдаётся только подмножество аномальных значений. В остальных деталях эксперимент идентичен предыдущему, и я не буду описывать их заново. Замечу только, что самый важный аспект эксперимента для веб-службы — это описание входных и выходных данных. Назовем эти данные следующим образом: Data (входные данные веб-службы) и AnomalyDetectionResult (выходные данные веб-службы).

Клиент веб-службы

После настройки экспериментов я могу развернуть их в виде веб-служб, получить к ним доступ через приложение RemoteCamera и выявлять аномальные показатели яркости изображения. Чтобы создать веб-службу, нужно запустить эксперимент, а затем нажать значок Deploy Web Service в нижней области окна Machine Learning Studio. Если вы не добавили в эксперимент модули ввода и вывода веб-службы, в этой области отобразится кнопка Set Up Web Service. После ее нажатия в эксперимент будут добавлены модули ввода и вывода веб-службы, а название кнопки изменится на Deploy Web Service.

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

Когда процесс развёртывания веб-службы завершится, откроется панель управления веб-службой. На этой панели отображается сводная информация о развёрнутой веб-службе, ключ API, а также инструкции по отправке запросов и обработке ответов (API Help Page). В частности, при нажатии гиперссылки request/response отображаются URL веб-службы и детальная структура запросов и ответов в формате JSON.

поиск аномалий машинное обучение. image loader. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-image loader. картинка поиск аномалий машинное обучение. картинка image loader.

Далее я сохраняю ключ API и создаю маппинги из JSON в C# с помощью службы JSONUtils (jsonutils.com). Затем я сохраняю полученные классы в соответствующие файлы — AnomalyDetectionRequest.cs и AnomalyDetectionResponse.cs во вложенной папке AnomalyDetection. Их структуры схожи — оба файла обычно содержат классы со свойствами, которые по большей части реализуются автоматически. AnomalyDetectionRequest и AnomalyDetectionResponse представляют собой передачу соответствующих объектов JSON между клиентом и веб-службой. К примеру, определение класса AnomalyDetectionRequest и зависимых объектов показано ниже. Обратите внимание, что для преобразования набора точек данных яркости в формат входных данных для веб-службы Machine Learning Studio (двумерные массивы строк) я использую вспомогательный класс ConversionHelper. Полное определение этого вспомогательного класса содержится в сопроводительном коде. Этот класс имеет два публичных метода. С их помощью набор точек данных яркости преобразуются в тип string[,] (BrightnessDataToStringTable) и обратно (AnomalyDetectionResponseToBrightnessData).

После создания маппинга объектов из JSON в C# можно приступить к написанию клиента веб-службы. Для этого я сначала установлю пакет Microsoft.AspNet.WebApi.Client NuGet, а затем использую его для определения класса AnomalyDetectionClient (см. соответствующий файл в сопроводительном коде). В этом классе есть три закрытых поля: baseAddress, apiKey and httpClient. В первом поле содержится URL веб-службы Machine Learning Studio, во втором — ключ API. Оба этих значения используются для создания экземпляра класса HttpClient (из установленного ранее пакета NuGet):

После создания клиента я могу начать отправку запросов в веб-службу Machine Learning Studio при помощи метода AnomalyDetectionClient.DetectAnomalyAsync. Этот метод обеспечивает получение набора точек данных яркости в качестве тестовых данных. Эти тестовые данные используются вместо файла CSV, который я использовал для экспериментов. С их помощью создается экземпляр запроса AnomalyDetection. Экземпляр этого класса затем отправляется в веб-службу для анализа при помощи метода расширения PostAsJsonAsync. Полученный ответ JSON преобразуется в экземпляр класса AnomalyDetectionResponse, который в итоге выдаётся функцией DetectAnomalyAsync. Смотрим, нет ли ошибок. Если необходимо, «выбрасываем» исключения.

AnomalyDetectionClient используется в методе AddTestValue класса AnomalyDetector. Как и AddTrainingValue, AddTestValue также вызывается обработчиком событий ImageProcessor_ProcessingDone (см. файл MainPage.xaml.cs в сопроводительном коде). Однако AddTestValue работает немного иначе, чем метод AddTrainingValue. В AddTrainingValue я добавляю точки данных яркости в экземпляр класса BrightnessDataset, который на внутреннем уровне использует универсальный класс List для введения скользящего интервала. В этом интервале хранятся тестовые значения (см. октябрьскую статью Джеймса Маккефри). По умолчанию скользящий интервал насчитывает 30 элементов, но это значение можно менять при помощи конструктора BrightnessDataset. Как показано на ниже, я отправляю данные для анализа после заполнения интервала. Затем проверяю наличие элементов в наборе аномальных значений, выданном веб-службой. Если элементы присутствуют, я запускаю событие AnomalyDetected, которое также используется для передачи аномалий в прослушиватели.

Чтобы отобразить аномальные значения в интерфейсе, я обрабатываю событие AnomalyDetected в классе MainPage следующим образом.

Я выполняю итерацию набора полученных значений, проверяя, не были ли они уже добавлены в локальное хранилище данных (свойство AnomalousValues модели просмотра). Если нет, то я добавляю их в набор наблюдаемых значений. В результате этого в списке, показанном на первой картинке, появятся только новые аномальные значения. Эта дополнительная проверка нужна, поскольку за время между двумя последовательными запросами в веб-службу в скользящем интервале изменился только один элемент.

Для тестирования моего решения нужно запустить приложение RemoteCamera, начать предпросмотр изображения с камеры и включить поиск аномалий, установив флажок на вкладке Anomaly Detection. После этого можно создавать аномальные значения, прикрывая камеру рукой. Детектор машинного обучения быстро выявит эти аномальные значения и отобразит их в окне списка.

Заключение

Я показал процедуру создания двух разных эксперимента по обнаружению аномалий в Azure Machine Learning Studio. Оба эксперимента были развёрнуты также в виде веб-служб и совмещены с клиентским приложением RemoteCamera, которое отправляет локально полученные данные временных рядов для машинного анализа с целью обнаружения аномалий. В данном случае я использовал веб-службу приложения Universal Windows Platform (UWP). Этот же код можно использовать для доступа к веб-службе через веб-приложение ASP.NET, в котором логика машинного обучения обрабатывается серверной частью, а не в конечной точке. В контексте IoT такой точкой может быть простой датчик.

Microsoft Developer School

28-30 ноября в Киеве впервые пройдет школа разработчиков в формате Open Hack.

Команды по 2–5 человек смогут поработать над существующим в их компании проектом либо познакомиться с технологическим стеком другого релевантного проекта.

Главными темами станут:

Источник

Анализ малых данных

КвазиНаучный блог Александра Дьяконова

Поиск аномалий (Anomaly Detection)

В этом посте поговорим об одной важной проблеме обучения без учителя (Unsupervised Learning) – задаче поиска аномалий (Anomaly Detection). Интересно, что в русскоязычных учебных курсах об этой задаче часто забывают. Даже в русской версии страницы обучение без учителя нет упоминания об этой задаче, в английской, конечно же, есть.

поиск аномалий машинное обучение. outlier detection2. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-outlier detection2. картинка поиск аномалий машинное обучение. картинка outlier detection2.

Строго говоря, в анализе данных есть два направления, которые занимаются поиском аномалий: детектирование выбросов (Outlier Detection) и «новизны» (Novelty Detection). Как и выброс «новый объект» — это объект, который отличается по своим свойствам от объектов (обучающей) выборки. Но в отличие от выброса, его в самой выборке пока нет (он появится через некоторое время, и задача как раз и заключается в том, чтобы обнаружить его при появлении). Например, если вы анализируете замеры температуры и отбрасываете аномально большие или маленькие, то Вы боретесь с выбросами. А если Вы создаёте алгоритм, который для каждого нового замера оценивает, насколько он похож на прошлые, и выбрасывает аномальные — Вы «боретесь с новизной».

Выбросы являются следствием:

На рис. 1 видно, что шум (noise) — это выброс «в слабом смысле» (он может немного размывать границы класса/кластера). Нас же интересуют, прежде всего, выбросы «в сильном смысле», которые искажают эти границы.

Новизна, как правило, появляется в результате принципиально нового поведения объекта. Скажем, если наши объекты – описания работы системы, то после проникновения в неё вируса объекты становятся «новизной». Ещё пример – описания работы двигателя после поломки. Здесь важно понимать, что «новизна» называется новизной по той причине, что такие описания для нас абсолютно новые, а новые они потому, что мы не можем в обучающей выборке иметь информацию о всевозможных заражениях вирусами или всевозможных поломках. Формирование такой обучающей выборки трудозатратно и часто не имеет смысла. Зато можно набрать достаточно большую выборку примеров нормальной (штатной) работы системы или механизма.

Приложений здесь море:

Стоит отметить, что возможных постановок задач здесь тоже много. Например, задача Positive-Unlabeled Classification (PU learning) – это когда часть выбросов обозначена (класс 1), но в остальных объектах обучения (класс 0) также могут содержаться выбросы. Например, нам эксперт сказал, что оборудование давало сбой в такие-то моменты времени, но он мог заметить не все сбои.

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

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

поиск аномалий машинное обучение. fig4 poly. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-fig4 poly. картинка поиск аномалий машинное обучение. картинка fig4 poly.Рис. 2. Пример выбросов во временном ряде. поиск аномалий машинное обучение. graphs. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-graphs. картинка поиск аномалий машинное обучение. картинка graphs.Рис. 3. Пример выбросов в графах и последовательностях.

Функционалы качества в задачах детектирования аномалий используют примерно такие же, как и в задачах классификации: PR AUC, AUROC, здесь всё определяется контекстом задачи (заказчиком).

Методы обнаружения выбросов

1. Статистические тесты

Как правило, применяют для отдельных признаков и отлавливают экстремальные значения (Extreme-Value Analysis). Для этого используют, например, Z-value или Kurtosis measure.

поиск аномалий машинное обучение. kurtosis2. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-kurtosis2. картинка поиск аномалий машинное обучение. картинка kurtosis2.Рис. 4. Пример выбросов.

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

Важно понимать, что экстремальное значение и аномалия это разные понятия. Например, в небольшой выборке

значение 39 можно считать аномалией, хотя оно не является максимальным или минимальным. Также стоит отметить, что аномалия характеризуется, как правило, не только экстремальными значениями отдельных признаков (см. рис. 5)

поиск аномалий машинное обучение. fig2 feats2. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-fig2 feats2. картинка поиск аномалий машинное обучение. картинка fig2 feats2.Рис. 5. Пример выбросов в задаче с двумя признаками.

2. Модельные тесты

Идея очень простая – мы строим модель, которая описывает данные. Точки которые сильно отклоняются от модели (на которых модель сильно ошибается) и есть аномалии (см. рис. 2). При выборе модели мы можем учесть природу задачи, функционал качества и т.п.

Такие методы хороши для определения новизны, но хуже работают при поиске выбросов. Действительно, при настройке модели мы используем данные, в которых есть выбросы (и она под них «затачивается»).

поиск аномалий машинное обучение. fig svd. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-fig svd. картинка поиск аномалий машинное обучение. картинка fig svd.Рис. 6. Применение SVD для нахождение выбросов в матрице

На рис. 6 показано применение модельного подхода. У нас есть матрица и требуется найти в ней выбросы. Мы используем неполное сингулярное разложение (SVD), чтобы найти матрицу небольшого ранга максимально похожую на нашу (для наглядности все числа округлены). Элементы, которые сильно отличаются от соответствующих элементов матрицы небольшого ранга, будем считать выбросами.

3. Итерационные методы

Методы, которые состоят из итераций, на каждой из которых удаляется группа «особо подозрительных объектов». Например, в n-мерном признаковом пространстве можно удалять выпуклую оболочку наших точек-объектов, считая её представителей выбросами. Как правило, методы этой группы достаточно трудоёмки.

поиск аномалий машинное обучение. fig4 vypukl. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-fig4 vypukl. картинка поиск аномалий машинное обучение. картинка fig4 vypukl.Рис. 7. Выпуклые оболочки множества точек.

4. Метрические методы

Судя по числу публикаций, это самые популярные методы среди исследователей. В них постулируется существование некоторой метрики в пространстве объектов, которая и помогает найти аномалии. Интуитивно понятно, что у выброса мало соседей, а у типичной точки много. Поэтому хорошей мерой аномальности может служить, например «расстояние до k-го соседа» (см. метод Local Outlier Factor). Здесь используются специфические метрики, например расстояние Махаланобиса.

поиск аномалий машинное обучение. fig2 nns. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-fig2 nns. картинка поиск аномалий машинное обучение. картинка fig2 nns.Рис. 8. Соседи нескольких элементов выборки, связь с 5м показана красным

5. Методы подмены задачи

Когда возникает новая задача, есть большой соблазн решить её старыми методами (ориентированными на уже известные задачи). Например, можно сделать кластеризацию, тогда маленькие кластеры, скорее всего, состоят из аномалий. Если у нас есть частичная информация об аномалиях (как в задаче PUC), то можно решить её как задачу классификации с классами 1 (размеченные аномалии) и 0 (все остальные объекты). Если бы класс 0 состоял только из нормальных объектов, то такое решение было бы совсем законным, иначе остаётся надеяться, что недетектированных аномалий в нём немного.

поиск аномалий машинное обучение. fig2 cluster. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-fig2 cluster. картинка поиск аномалий машинное обучение. картинка fig2 cluster.Рис. 9. Пример кластеризации на малый (красный) и большой (синий) кластер.

6. Методы машинного обучения

А что если воспринять задачу нахождения аномалий как новую задачу машинного обучения (отличную от классификации и кластеризации)?!

Самые популярные алгоритмы (есть реализация даже в scikit-learn) здесь:

Важные параметры реализации sklearn.svm.OneClassSVM:

Изолирующий лес (Isolation Forest) – это одна из вариаций идеи случайного леса. Как всегда: простая и надёжная.

Логика алгоритма простая: при описанном «случайном» способе построения деревьев выбросы будут попадать в листья на ранних этапах (на небольшой глубине дерева), т.е. выбросы проще «изолировать» (напомним, что дерево строится до тех пор, пока каждый объект не окажется в отдельном листе). Алгоритм хорошо отлавливает именно выбросы (см. рис. 12).

поиск аномалий машинное обучение. fig if. поиск аномалий машинное обучение фото. поиск аномалий машинное обучение-fig if. картинка поиск аномалий машинное обучение. картинка fig if.Рис. 12. Оценки изолирующего леса для одномерной выборки.

Важные параметры реализации sklearn.ensemble.IsolationForest

Эллипсоидальная аппроксимация данных — из названия понятно, что облако точек моделируется как внутренность эллипсоида. Метод хорошо работает только на одномодальных данных, а совсем хорошо – на нормально распределённых. Степень новизны здесь фактически определяется по расстоянию Махаланобиса.

7. Ансамбли алгоритмов

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

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

Кстати, здесь «усреднение» не обязательно означает среднее арифметическое всех оценок, интуитивно понятно, что часто может сработать максимум (если какой-то алгоритм уверен в аномальности объекта, то скорее всего так оно и есть).

История из практики

В задачах поиска аномалий важно понимать, как работают алгоритмы поиска, и объяснить это заказчику. Например, когда автор последний раз участвовал в решении подобной задачи, заказчик хотел средство для детектирования поломок, но из-за природы модели получился алгоритм детектирования «неправильного функционирования оборудования», т.е. он давал сигнал не только в случае поломок, но и в случае некорректной эксплуатации прибора, а также при работе в очень редких режимах. Некоторые поломки (очень частые) он всё-таки пропускал, т.к. «они уже стали для прибора нормой». Понятно, что при наличии большой размеченной выборки таких проблем не возникало бы, но на практике оборудование работает не так долго, поломок тоже мало (и не все возможные случаются), а некоторые поломки могли не заметить или заметить с запозданием. Кроме того, некоторые поломки никак не отражаются на показаниях датчиков. Изначально качество очень расстроило заказчика, но когда ему объяснили, как работает алгоритм, заказчик сверился с данными испытаний и убедился, что алгоритм очень полезный, даже если не находит какие-то поломки: его можно использовать как верификатор «работает ли прибор в штатном режиме», а это самое главное.

П.С. Код для получения рис.10 можно взять здесь.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *