Виявлення аномалії з відкритим кодом у Python


61

Передумови проблеми: я працюю над проектом, який включає файли журналів, аналогічні тим, які знаходяться в просторі моніторингу ІТ (наскільки я найкраще розумію ІТ-простір). Ці файли журналів - це дані часового ряду, впорядковані в сотні / тисячі рядків різних параметрів. Кожен параметр є числовим (поплавком) і існує значення нетривіального / не помилки для кожної точки часу. Моє завдання - відстежувати вказані файли журналів для виявлення аномалії (шипи, падіння, незвичайні зразки, де деякі параметри не синхронізовані, дивна поведінка похідних 1-го / 2-го і т.д. тощо).

У подібному завданні я спробував Splunk з Prelert, але зараз я вивчаю варіанти з відкритим кодом.

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

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

Ресурси: Я перевірив наступне з тупиковими результатами:

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

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

  3. Моя наступна спроба Skyline, здається, була майже припинена (з питань github ). Я не заглиблювався в це, враховуючи те, наскільки мало підтримки в Інтернеті.

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

Визначення проблеми та питання: Я шукаю програмне забезпечення з відкритим кодом, яке може допомогти мені автоматизувати процес виявлення аномалії з файлів журналів часових рядів в Python через пакети або бібліотеки.

  1. Чи існують такі речі, щоб допомогти в моєму безпосередньому завданні, чи вони уявні в моїй свідомості?
  2. Чи може хтось допомогти конкретними кроками, щоб допомогти мені досягти своєї мети, включаючи основні основи чи концепції?
  3. Це найкраща спільнота StackExchange для запиту, чи кращі варіанти - статистика, математика чи навіть безпека чи Stackoverflow?

EDIT [2015-07-23] Зауважте, що останнє оновлення пікуліарності, здається, виправлене для середовища Windows! Я ще маю підтвердити, але це повинен бути ще одним корисним інструментом для громади.

EDIT [2016-01-19] Незначне оновлення. Я не встиг попрацювати над цим і дослідженням, але я роблю крок назад, щоб зрозуміти основи цієї проблеми, перш ніж продовжувати дослідження конкретних деталей. Наприклад, два конкретні кроки, які я роблю, це:

  1. Починаючи з статей у Вікіпедії для виявлення аномалії [ https://en.wikipedia.org/wiki/Anomaly_detection ], розуміння цілком, а потім або переміщення вгору або вниз в ієрархії концепцій інших пов'язаних статей Вікіпедії, таких як [ https: // en.wikipedia.org/wiki/K-nevable_neighbors_algorithm ], а потім до [ https://en.wikipedia.org/wiki/Machine_learning ].

  2. Вивчення методів у великих опитуваннях, проведених Чандолою та ін 2009 р. "Виявлення аномалії: опитування" [ http://www-users.cs.umn.edu/~banerjee/papers/09/anomaly.pdf ] та Hodge et al 2004 "Огляд методів виявлення випереджаючих" [ http://eprints.whiterose.ac.uk/767/1/hodgevj4.pdf ].

Після того, як поняття будуть краще зрозумілі (я сподіваюся пограти з прикладами іграшок, коли я також збираюся розробити практичну сторону), я сподіваюся зрозуміти, які інструменти Python з відкритим кодом краще підходять для моїх проблем.


Я рекомендую ці відео, якщо ви тільки починаєте Scikit: github.com/justmarkham/scikit-learn-videos
Harvey

Бібліотека h2o не імпортується в цей модуль.

1
Ваша проблема погано визначена. Те, що являє собою аномалію, може мати багато різних значень. Це відхилення середнього? Це певні зразки поведінки? У кожному конкретному випадку застосовуються різні методи. Вам потрібно буде вивчити "зовнішнє виявлення", якщо аномалія є відхиленням від середнього. Якщо ви шукаєте конкретні зразки, вам буде набагато краще подати керований алгоритм навчання, такий як нейронні мережі.
Віллем ван Дусбург

1
Я знаю, що ви хочете Python, але для виявлення аномалії ELKI, здається, є інструментом для використання.
Аноні-Мус

Відповіді:


35

Виявлення аномалії або виявлення подій може здійснюватися різними способами:

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

Похідне! Якщо відхилення вашого сигналу від його минулого та майбутнього велике, швидше за все, у вас є подія. Це можна отримати, знайшовши великі нульові перетини в похідній сигналу.

Статистичний шлях

Має на увазі що-небудь його звичайна, основна поведінка. якщо щось відхиляється від середнього, це означає, що це подія. Зверніть увагу, що середнє значення в часових рядах не є тривіальним і не є постійним, але змінюється відповідно до змін часових рядів, тому вам потрібно побачити "ковзну середню" замість середньої. Це виглядає приблизно так:

Події - це піки, що перевищують 1 стандартне відхилення від ковзної середньої

Код Moving Average можна знайти тут . У термінології обробки сигналів ви застосовуєте фільтр "Низький пропуск" , застосовуючи ковзну середню.

Ви можете дотримуватися наведеного нижче коду:

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])

Імовірнісний шлях

Вони є більш досконалими спеціально для людей, які не є новими в машинному навчанні. Kalman Filter - відмінна ідея для пошуку аномалій . Простіші ймовірнісні підходи, що використовують "Максимально-ймовірнісну оцінку", також добре працюють, але моя пропозиція полягає в тому, щоб дотримуватися ідеї ковзної середньої. Це працює на практиці дуже добре.

Я сподіваюся, що міг би допомогти :) Удачі!


Дякую за ваші зусилля щодо глибокої дискусії. Хоча програмування це не здається занадто поганим (можна сказати, досить цікаво, глибоко занурившись в алгоритми), мені цікаво, що вже доступні пакети. Чи знаєте ви про що-небудь, що існує, просте в установці? Зауважте, це не те саме, що просте у виконанні, що, наскільки я розумію, не можна гарантувати. Якщо я можу зробити своє середовище функціональним, я вважаю, що можу його вдосконалити на основі прикладів для мого завдання.
ximiki

15

h2o має модуль виявлення аномалії і традиційно код доступний у R.Hoyond поза версією 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)

Дякую! Я ще не розглядав цей пакет - додам його до списку кандидатів. Для уточнення, коли ви говорите, що "поза версією 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 тунці O utlier D etection інструментів ( PyOD ). Дивіться GitHub .

Він призначений для ідентифікації сторонніх об'єктів у даних як під наглядом, так і під наглядом. PyOD представлений для:

  • Уніфіковані API, детальна документація та інтерактивні приклади в різних алгоритмах.
  • Удосконалені моделі, включаючи нейронні мережі / глибоке навчання та ансамблі для випередження.
  • Оптимізована продуктивність за допомогою 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-го найближчого сусіда в якості бала - ** outlier
  • AvgKNN : середній kNN (використовуйте середню відстань до k найближчих сусідів як вищий показник)
  • MedKNN : медіанна kNN (використовуйте серединну відстань до найближчих сусідів як кращий показник)
  • ВІД : Виявлення зовнішньої форми на основі кута
  • FastABOD : Швидке виявлення вищого кута на основі кута наближення
  • SOS : Стохастичний вибір зовнішньої форми
  • IForest : ізоляція лісу
  • Функція Баггінг
  • LSCP : LSCP: Місцево-селективне поєднання паралельних зовнішніх ансамблів
  • XGBOD : Екстремальне підсилення виявлення вищого рівня (під наглядом)
  • AutoEncoder : Повністю підключений AutoEncoder (використовувати помилку відновлення як показник "outlier")
  • SO_GAAL : Одноцільне генеративне змагальне активне навчання
  • MO_GAAL : Багатоцільне генеративне змагальне активне навчання

Вихідні детектори / показники рамок комбінацій :

  • Функція Баггінг
  • LSCP : LSCP: Місцево-селективне поєднання паралельних зовнішніх ансамблів
  • Середня : Просте поєднання шляхом усереднення балів
  • Середньозважене : Просте поєднання шляхом усереднення балів із вагою детектора
  • Максимізація : проста комбінація шляхом отримання максимальних балів
  • AOM : Середнє значення максимуму
  • MOA : Максимізація середнього

Функції утиліти для виявлення зовнішнього вигляду :

  1. score_to_lable (): конвертувати неочищені результати випередження у бінарні мітки
  2. precision_n_scores (): одна з популярних оціночних показників для видобутку поза межами (precision @ rank n)
  3. gene_data (): генерувати псевдодані для експерименту виявлення зовнішньої форми
  4. wpearsonr (): зважений пірсон корисний для генерації правди псевдоземної істини

Порівняння всіх реалізованих моделей доступно нижче: ( Рисунок , Код , Ноутбуки Юпітера ):введіть тут опис зображення

Якщо ви зацікавлені, перегляньте 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. Я також розглядаю подібну проблему.
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
Щоб повторити і, можливо, бути більш тупим, використання пакету AnomalyDetection від Twitter тут НЕ є можливим: уважно прочитайте розділ «Обмеження» уважніше. Я не хочу засуджувати будь-яких щирих спроб допомогти у цьому, але питання стосується виключно пакетів на основі Python. Тому, майбутні виборці, БУДЬ ЛАСКА не відповідати на цю відповідь, оскільки це непридатний варіант. Я б рекомендував очистити поточні 2 голоси за це шляхом незважаючи на голосування, але, можливо, це неетично в спільноті Stackexchange і не хочуть ловити жодних недоліків.
ximiki

1
Знову прошу вибачення за те, що можна зробити це, але я просто намагаюся зробити це питання дуже зрозумілим і корисним для інших, хто зіткнувся з подібною проблемою, і не хочу, щоб вони йшли на погоню за дикими гусками.
ximiki

6

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

Однак у випадку, якщо ваша функція є цілим лог-файлом, потрібно спершу підсумувати її до якоїсь особливості того ж розміру, а потім застосувати виявлення Novealty.


3

Досі існує активна і розроблена версія Skyline, про всяк випадок, якщо хтось тут приземлиться і зацікавиться.

https://github.com/earthgecko/skyline

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

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


1

Оскільки у вас є багатоваріантний часовий ряд, я б пішов на реалізацію LSTM-RNN, яка моделює динаміку вашої системи на основі даних про навчання, які зазвичай є напівконтрольованими (включається лише нормальний клас). Це означає, що ви навчаєте свою модель, щоб дізнатися, що є "нормальним". Під час тестування ви перевіряєте як нормальні, так і аномальні умови, щоб побачити, наскільки добре модель їх роз'єднує.

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

В Python, це майже тривіальним реалізувати LSTM-РНН з використанням Keras API (поверх Tensorflow бекенда). Ця мережа вчиться оцінювати сигнал (и), що цікавлять, задаючи довільну кількість входів, яку ви згодом порівнюєте з фактичним вимірюваним значенням. Якщо є "велике" відхилення, ви отримали аномалію (враховуючи, що модель досить точна)!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.