Обнаружение аномалий с открытым исходным кодом в Python

61

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

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

Ограничения: я ограничиваю себя Python, потому что я хорошо его знаю и хотел бы отложить переход на R и связанную с этим кривую обучения. Если, кажется, не существует подавляющей поддержки R (или других языков / программного обеспечения), я бы хотел использовать Python для этой задачи.

Кроме того, я работаю в среде Windows на данный момент. Я хотел бы продолжить изолированную программную среду в Windows для небольших файлов журнала, но при необходимости могу перейти в среду Linux.

Ресурсы: я проверил следующее с тупиками в качестве результатов:

  1. Python или R для реализации алгоритмов машинного обучения для обнаружения мошенничества . Некоторая информация здесь полезна, но, к сожалению, я изо всех сил пытаюсь найти правильный пакет, потому что:

  2. Твиттер "AnomalyDetection" находится в R, и я хочу придерживаться Python. Кроме того, особенность порта Python, кажется, вызывает проблемы при реализации в среде Windows для меня.

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

  4. scikit-learn, я все еще изучаю, но это, кажется, намного больше руководства. Подход "подавление сорняков" - это нормально для меня, но мой опыт работы с инструментами обучения слаб, поэтому я хотел бы что-то вроде черного ящика для технических аспектов, таких как алгоритмы, подобные Splunk + Prelert.

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

  1. Существуют ли такие вещи, чтобы помочь с моей непосредственной задачей, или они воображаемы в моем уме?
  2. Может ли кто-нибудь помочь с конкретными шагами, чтобы помочь мне в достижении моей цели, в том числе базовых основ или концепций?
  3. Является ли это лучшим сообществом StackExchange, или Stats, Math или даже Security или Stackoverflow - лучшие варианты?

РЕДАКТИРОВАТЬ [2015-07-23] Обратите внимание, что последнее обновление для Py ОС, похоже, исправлено для среды Windows! Я еще не подтвердил, но должен стать еще одним полезным инструментом для сообщества.

РЕДАКТИРОВАТЬ [2016-01-19] Небольшое обновление. У меня не было времени поработать над этим и исследовать, но я делаю шаг назад, чтобы понять основы этой проблемы, прежде чем продолжать исследовать конкретные детали. Например, я предпринимаю два конкретных шага:

  1. Начиная со статей в Википедии для обнаружения аномалий [ https://en.wikipedia.org/wiki/Anomaly_detection ], полностью понимая, а затем перемещаясь вверх или вниз в иерархии концепций других связанных статей Википедии, таких как [ https: // en.wikipedia.org/wiki/K-nearest_neighbors_algorithm ], а затем на [ https://en.wikipedia.org/wiki/Machine_learning ].

  2. Изучение методов в великих обзорах, проведенных Чандолой и др. 2009 «Обнаружение аномалий: опрос» [ http://www-users.cs.umn.edu/~banerjee/papers/09/anomaly.pdf ] и Ходж и др. 2004 «Обзор методологий обнаружения выбросов» [ http://eprints.whiterose.ac.uk/767/1/hodgevj4.pdf ].

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

ximiki
источник
Я рекомендую эти видео, если вы только начинаете Scikit: github.com/justmarkham/scikit-learn-videos
Харви
Библиотека h2o не импортируется в этот модуль.
1
Ваша проблема плохо определена. То, что представляет собой аномалию, может иметь много разных значений. Это отклонение от среднего? Это определенные модели поведения? В каждом случае применяются разные методы. Вам нужно изучить «обнаружение выбросов», если аномалия отклоняется от среднего значения. Если вы ищете конкретные шаблоны, вам будет гораздо лучше работать с контролируемым алгоритмом обучения, таким как нейронные сети.
Виллем ван Дусбург
1
Я знаю, что вы хотите Python, но для обнаружения аномалий ELKI, кажется, является инструментом для использования.
Anony-Mousse

Ответы:

35

Обнаружение аномалий или обнаружение событий может быть выполнено различными способами:

Основной способ

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

Статистический путь

Смысл чего-либо - это его обычное, основное поведение. если что-то отклоняется от значения, это означает, что это событие. Обратите внимание, что среднее значение во временных рядах не так тривиально и не является константой, а меняется в зависимости от изменений во временных рядах, поэтому вам нужно видеть «скользящее среднее» вместо среднего. Это выглядит так:

События - это пики, превышающие 1 стандартное отклонение от скользящей средней

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

Вы можете следовать приведенному ниже коду:

MOV = movingaverage(TimeSEries,5).tolist()
STD = np.std(MOV)
events= []
ind = []
for ii in range(len(TimeSEries)):
    if TimeSEries[ii] > MOV[ii]+STD:
        events.append(TimeSEries[ii])

Вероятностный путь

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

Я надеюсь, что смогу помочь :) Удачи!

Касра Маншаи
источник
Спасибо за ваши усилия по глубокому обсуждению. Хотя программирование не кажется таким уж плохим (я могу сказать, довольно интересно углубиться в алгоритмы), мне любопытно, какие пакеты уже доступны. Знаете ли вы что-нибудь, что существует, что просто установить? Обратите внимание, что это не то же самое, что простая реализация, что, как я понимаю, не гарантируется. Если я смогу сделать свою среду функциональной, я верю, что смогу усовершенствовать ее на основе примеров для своей задачи.
ximiki
15

В h2o есть модуль обнаружения аномалий, и традиционно код доступен в R. Однако, помимо версии 3, он имеет аналогичный модуль, доступный и в python, и, поскольку h2o является открытым исходным кодом, он может соответствовать вашим требованиям.

Вы можете увидеть рабочий пример здесь

import sys
sys.path.insert(1,"../../../")
import h2o

def anomaly(ip, port):
    h2o.init(ip, port)

    print "Deep Learning Anomaly Detection MNIST"

    train = h2o.import_frame(h2o.locate("bigdata/laptop/mnist/train.csv.gz"))
    test = h2o.import_frame(h2o.locate("bigdata/laptop/mnist/test.csv.gz"))

    predictors = range(0,784)
    resp = 784

    # unsupervised -> drop the response column (digit: 0-9)
    train = train[predictors]
    test = test[predictors]

    # 1) LEARN WHAT'S NORMAL
    # train unsupervised Deep Learning autoencoder model on train_hex
    ae_model = h2o.deeplearning(x=train[predictors], training_frame=train, activation="Tanh", autoencoder=True,
                                hidden=[50], l1=1e-5, ignore_const_cols=False, epochs=1)

    # 2) DETECT OUTLIERS
    # anomaly app computes the per-row reconstruction error for the test data set
    # (passing it through the autoencoder model and computing mean square error (MSE) for each row)
    test_rec_error = ae_model.anomaly(test)

    # 3) VISUALIZE OUTLIERS
    # Let's look at the test set points with low/median/high reconstruction errors.
    # We will now visualize the original test set points and their reconstructions obtained
    # by propagating them through the narrow neural net.

    # Convert the test data into its autoencoded representation (pass through narrow neural net)
    test_recon = ae_model.predict(test)

    # In python, the visualization could be done with tools like numpy/matplotlib or numpy/PIL

if __name__ == '__main__':
    h2o.run_test(sys.argv, anomaly)
0xF
источник
Спасибо! Я еще не рассматривал этот пакет - я добавлю его в список кандидатов. Чтобы уточнить, когда вы говорите, что «помимо версии 3 у него есть аналогичный модуль, также доступный в python», знаете ли вы, доступен ли модуль обнаружения аномалий в h2o (помимо версии 3) в Python или какой-то другой модуль?
ximiki
1
@ximik Что ж, я повторно посетил документацию по Python их последней версии 3.0.0.26 ( h2o-release.s3.amazonaws.com/h2o/rel-shannon/26/docs-website/… ) и похоже, что h2o.anomaly нет в отличие от его R api. Я поднял вопрос в их группе Google ( groups.google.com/forum/#!topic/h2ostream/uma3UdpanEI ), и вы можете следить за этим.
0xF
1
Что ж, группа поддержки h2o ответила на вопрос, и аномалия также доступна в python. Пример доступен здесь. github.com/h2oai/h2o-3/blob/master/h2o-py/tests/testdir_algos/…
0xF
Отлично! спасибо за расследование. Я обновлю этот пост с результатами.
ximiki
1
ссылка на тест h2o больше не работает, но есть (вероятно) эквивалентный: github.com/h2oai/h2o-3/blob/master/h2o-py/tests/testdir_algos/… (постоянная ссылка на версию на момент написания статьи github.com/h2oai/h2o-3/blob/… )
Андре Хольцнер
11

Недавно я разработал набор инструментов: Py thon O utlier D etection toolbox ( PyOD ). Смотрите GitHub .

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

  • Унифицированные API, подробная документация и интерактивные примеры по различным алгоритмам.
  • Продвинутые модели, в том числе Нейронные сети / Deep Learning и Outlier Ensembles.
  • Оптимизированная производительность с JIT и распараллеливанием, когда это возможно, с использованием Numba и JobLib. Совместим с Python 2 и 3 (также совместим с Scikit-Learn).

Вот несколько важных ссылок:

Если вы используете PyOD в научной публикации, мы будем благодарны за ссылки на следующую статью

@article{zhao2019pyod,
  title={PyOD: A Python Toolbox for Scalable Outlier Detection},
  author={Zhao, Yue and Nasrullah, Zain and Li, Zheng},
  journal={arXiv preprint arXiv:1901.01588},
  year={2019},
  url={https://arxiv.org/abs/1901.01588}
}

В настоящее время он находится на рассмотрении в JMLR (трек программного обеспечения с открытым исходным кодом для машинного обучения). Смотрите препринт .


Краткое введение

Набор инструментов PyOD состоит из трех основных групп функций: (i) алгоритмы обнаружения выбросов; (ii) ансамблевые структуры выбросов и (iii) функции утилизации обнаружения выбросов.

Индивидуальные алгоритмы обнаружения :

  • PCA : анализ главных компонентов (сумма взвешенных проецируемых расстояний до гиперплоскостей собственного вектора)
  • MCD : определитель минимальной ковариации (используйте расстояния махаланобиса в качестве баллов выбросов)
  • OCSVM : одноклассные опорные векторные машины
  • LOF : локальный коэффициент выбросов
  • CBLOF : основанный на кластеризации локальный фактор выбросов
  • LOCI : LOCI: быстрое обнаружение выбросов с использованием интеграла локальной корреляции
  • HBOS : гистограммный показатель выбросов
  • kNN : k ближайших соседей (используйте расстояние до k-го ближайшего соседа в качестве - ** показателя выброса
  • AvgKNN : средний kNN (используйте среднее расстояние до k ближайших соседей в качестве показателя выбросов)
  • MedKNN : медианный kNN (используйте среднее расстояние до k ближайших соседей в качестве показателя выбросов)
  • ABOD : угловое обнаружение выбросов
  • FastABOD : быстрое угловое обнаружение выбросов с использованием аппроксимации
  • SOS : стохастический выбор выбросов
  • IForest : лес изоляции
  • Особенности Bagging
  • LSCP : LSCP: локально-выборочная комбинация параллельных ансамблей выбросов
  • XGBOD : экстремальное усиление обнаружения выбросов (под наблюдением)
  • AutoEncoder : полностью подключенный AutoEncoder (используйте ошибку реконструкции в качестве значения выброса)
  • SO_GAAL : одно-объективное порождающее состязательное активное обучение
  • MO_GAAL : многоцелевое порождающее состязательное активное обучение

Комбинации детекторов / счетчиков выбросов :

  • Особенности Bagging
  • LSCP : LSCP: локально-выборочная комбинация параллельных ансамблей выбросов
  • Среднее : простая комбинация путем усреднения баллов
  • Средневзвешенное значение : простая комбинация путем усреднения оценок с весами детекторов
  • Максимизация : простая комбинация с максимальным количеством очков
  • AOM : Среднее из Максимума
  • МОА : Максимизация среднего

Функции утилит для обнаружения выбросов :

  1. score_to_lable (): конвертировать необработанные значения выбросов в двоичные метки
  2. precision_n_scores (): одна из популярных метрик оценки для анализа выбросов (precision @ rank n)
  3. generate_data (): генерировать псевдоданные для эксперимента по обнаружению выбросов
  4. wpearsonr (): взвешенный Пирсон полезен для генерации псевдо-наземной правды

Сравнение всех реализованных моделей доступно ниже: ( Рисунок , Код , Jupyter Notebooks ):введите описание изображения здесь

Если вы заинтересованы, пожалуйста, проверьте Github ( https://github.com/yzhao062/Pyod ) для получения дополнительной информации.

Юэ Чжао
источник
8

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

То, что я нашел, я думаю, что лучше всего соответствует вашим потребностям и лучше по сравнению с тем, что вы видели. т.е. TwitterAnomalyDetection, SkyLine.

Я обнаружил, что лучше NAB Numenta (Numenta Anomaly Benchmark). Он также имеет очень хорошую поддержку сообщества, и для вас плюс - его открытый исходный код, разработанный на python. Вы можете добавить свой алгоритм в нем.

В случае алгоритма я обнаружил, что LOF или CBLOF - хороший вариант.

Итак, проверьте это один раз. Это может помочь вам. https://github.com/numenta/nab

Если вы найдете лучший вариант. пожалуйста, скажите мне. Я тоже на том же пути.

Удачи!

Дивьянг Шах
источник
Спасибо за ценную информацию! Я обязательно проверю это.
ximiki
3
Я просто хотел вернуться и прокомментировать, насколько применимо NAB к моей проблеме. Единственный недостаток, который я вижу, состоит в том, что это только для обнаружения аномалий временных рядов с одномерным (один столбец), но как насчет многомерного (много столбцов)? Спасибо за это предложение, я собираюсь выдвинуть его в список кандидатов на решение.
ximiki
@ximiki Вы нашли что-нибудь для MultiVariate Time-Series. Я также смотрю на подобную проблему.
shubham003
7

Может быть, это поможет вам упомянуть о стационарных состояниях: https://github.com/twitter/AnomalyDetection

https://blog.twitter.com/2015/introducing-practical-and-robust-anomaly-detection-in-a-time-series

Александру Дайя
источник
1
Спасибо за ваше время, но, пожалуйста, смотрите мой первый пункт "Ресурсы"; Я рассмотрел эту опцию и ищу что-то, что соответствует моим «Ограничениям».
ximiki
1
Повторим и, возможно, будем более откровенны, использование пакета Twitter AnomalyDetection НЕ является вариантом здесь: пожалуйста, прочитайте раздел «Ограничения» более внимательно. Я не хочу осуждать любые искренние попытки помочь в этом, но вопрос строго для пакетов на основе Python. Поэтому, будущие избиратели, ПОЖАЛУЙСТА, не одобряйте этот ответ, потому что это не годный для использования вариант. Я бы порекомендовал очистить текущие 2 голоса за это с помощью понижения голосов, но, возможно, это неэтично в сообществе Stackexchange и не хочет заразиться неудачей.
ximiki
1
Опять же, я прошу прощения за это, но я просто пытаюсь сделать этот вопрос очень ясным и полезным для других, сталкивающихся с подобной проблемой, и не хочу, чтобы они пошли в погоню за диким гусем.
ximiki
6

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

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

западня
источник
3

Есть все еще активная и развитая версия Skyline, на случай, если кто-то приземлится здесь и будет заинтересован.

https://github.com/earthgecko/skyline

https://earthgecko-skyline.readthedocs.io/en/latest

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

earthgecko
источник
1

Поскольку у вас есть многовариантные временные ряды, я бы выбрал реализацию LSTM-RNN, которая моделирует динамику вашей системы на основе обучающих данных, которые обычно находятся под полудонтролем (включая только нормальный класс). Это означает, что вы тренируете свою модель, чтобы узнать, что является «нормальным». Во время тестирования вы проверяете как нормальные, так и аномальные условия, чтобы увидеть, насколько хорошо модель отличает их друг от друга.

Преимущество нейронных сетей состоит в том, что они «изучают» взаимные корреляции между входными сигналами самостоятельно; вам не нужно исследовать их вручную. В частности, LSTM-RNN являются идеальным выбором, когда речь заходит о моделировании временных рядов просто потому, что они способны сохранять память о предыдущих входных данных, аналогично модели пространства состояний в теории управления (если вы видите аналогию).

В Python почти тривиально реализовать LSTM-RNN с использованием Keras API (поверх серверной части Tensorflow). Эта сеть учится оценивать интересующий сигнал (сигналы) по произвольному количеству входов, которые вы затем сравниваете с фактическим измеренным значением. Если есть «большое» отклонение, вы получите аномалию (учитывая, что модель достаточно точна)!

pcko1
источник