Используйте Keras для разработки надежной архитектуры NN, которую можно использовать для эффективного распознавания аномалий в последовательностях.

Предположим, у вас есть очень длинный список последовательностей строк, например список аминокислотных структур ('PHE-SER-CYS', 'GLN-ARG-SER', ...), серийные номера продуктов ('AB121E', 'AB323 ',' DN176 '…) или пользовательские UID, и вам необходимо создать какой-либо процесс проверки, который обнаружит аномалии в этой последовательности. Аномалия может представлять собой строку, которая имеет несколько иной или необычный формат, чем другие (независимо от того, была ли она создана по ошибке или намеренно), или просто строка, которая встречается крайне редко. Чтобы сделать вещи еще более интересными, предположим, что вы не знаете, какому правильному формату или структуре должны следовать последовательности.

Это относительно распространенная проблема (хотя и с необычным поворотом), которую многие специалисты по данным обычно решают, используя один из популярных алгоритмов машинного обучения без учителя, таких как DBScan, Isolation Forest и т. Д. Многие из этих алгоритмов обычно хорошо справляются с поиском аномалий или ошибок. выбросов, выделяя точки данных, которые относительно далеки от других или от областей, в которых находится большинство точек данных. Хотя автокодеры также хорошо известны своими способностями к обнаружению аномалий, они работают совершенно по-другому и менее распространены, когда дело доходит до проблем такого рода.

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

Использование автокодировщиков для обнаружения аномалий обычно включает два основных этапа:

Сначала мы передаем наши данные в автокодировщик и настраиваем его до тех пор, пока он не будет хорошо обучен для восстановления ожидаемого результата с минимальной ошибкой. Например, автоэнкодер, который принимает входные данные типа 10,5,100 и возвращает 11,5,99, хорошо обучен, если мы рассматриваем реконструированный выход как достаточно близкий ко входу и если автокодер может успешно восстановить большую часть данных. в этом случае.

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

Время для кода

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

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

  1. Создайте набор случайных последовательностей строк, соответствующих указанному формату, и добавьте несколько аномалий.
  2. Кодируйте последовательности в числа и масштабируйте их.
  3. Разработайте, установите и настройте автокодировщик.
  4. Подайте последовательности в обученный автоэнкодер и вычислите значение ошибки для каждой точки данных.
  5. Найдите аномалии, найдя точки данных с наибольшим значением ошибки.
  6. Создайте длинную последовательность строк.

Мы начнем с написания функции, которая создает строки следующего формата: CEBF0ZPQ ([4 буквы A-F] [1 цифра 0–2] [3 буквы QWOPZXML]) и генерирует 25K последовательностей этого формата.

2. Кодируйте последовательности строк в числа и масштабируйте их.

Теперь у нас есть массив следующей формы, поскольку каждая последовательность строк состоит из 8 символов, каждый из которых закодирован как число, которое мы будем рассматривать как столбец.

encoded_seqs.shape
#(25005,8)

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

3. Разработайте, установите и настройте автокодировщик.

Как упоминалось ранее, существует несколько способов создания автокодировщика. Обычно он основан на небольших скрытых слоях, обернутых более крупными слоями (это то, что создает эффект кодирования-декодирования). Я провел несколько сеансов настройки, чтобы определить лучшие параметры для использования здесь, поскольку разные типы данных обычно поддаются очень разным параметрам наилучшей производительности.

И, действительно, наш автоэнкодер, кажется, работает очень хорошо, так как он может весьма впечатляюще минимизировать член ошибки (или функцию потерь).

4. Рассчитайте ошибку и найдите аномалии!

Теперь мы снова передаем данные в автокодировщик и проверяем срок ошибки для каждого образца. Напомним, что seqs_ds - это фрейм данных pandas, в котором хранятся фактические последовательности строк. Строка №2 кодирует каждую строку, а строка №4 масштабирует ее. Затем я использую метод pred (), чтобы получить восстановленные входные данные строк, хранящихся в seqs_ds. Наконец, я получаю термин ошибки для каждой точки данных, вычисляя «расстояние» между точкой входных данных (или фактической точкой данных) и выходом, который был восстановлен автокодировщиком:

mse = np.mean(np.power(actual_data - reconstructed_data, 2), axis=1)

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

Как мы обнаруживаем аномалии?

Что ж, первое, что нам нужно сделать, это решить, каков наш порог, и это обычно зависит от наших данных и знания предметной области. Кто-то скажет, что аномалия - это точка данных, значение ошибки которой превышает 95% наших данных, например. Это было бы подходящим порогом, если мы ожидаем, что 5% наших данных будут аномальными. Однако напомним, что мы добавили 5 аномалий в список из 25000 идеально отформатированных последовательностей, что означает, что только 0,02% наших данных являются аномальными, поэтому мы хотим установить наш порог выше 99,98% наших данных (или 0,9998 процентиля). . Итак, сначала давайте найдем этот порог:

Затем я добавлю столбец MSE_Outlier к набору данных и установлю для него значение 1, когда член ошибки пересекает этот порог.

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

['XYDC2DCA', 'TXSX1ABC','RNIU4XRE','AABDXUEI','SDRAC5RF']

Итак, давайте посмотрим, сколько у нас выбросов и являются ли они теми, которые мы ввели.

А также…. Вуаля! Мы обнаружили 6 выбросов, 5 из которых являются «настоящими» выбросами.

Похоже на волшебство, ха?

Исходный код на git доступен ее e