Wykrywanie anomalii open source w Pythonie


61

Tło problemu: Pracuję nad projektem, który obejmuje pliki dziennika podobne do plików znalezionych w przestrzeni monitorowania IT (według mojego najlepszego zrozumienia przestrzeni IT). Te pliki dziennika są danymi szeregów czasowych, uporządkowanymi w setki / tysiące wierszy o różnych parametrach. Każdy parametr ma wartość liczbową (zmiennoprzecinkową) i dla każdego punktu czasowego istnieje wartość nietrywialna / bezbłędna. Moim zadaniem jest monitorowanie wspomnianych plików dziennika w celu wykrycia anomalii (skoki, upadki, nietypowe wzorce z niektórymi parametrami niezsynchronizowanymi, dziwne zachowanie 1/2 / itd. Pochodnej itp.).

Przy podobnym zadaniu wypróbowałem Splunk z Prelertem, ale obecnie badam opcje open source.

Ograniczenia: Ograniczam się do Pythona, ponieważ dobrze go znam i chciałbym opóźnić przejście na R i powiązaną krzywą uczenia się. O ile nie wydaje się, aby istniało przytłaczające wsparcie dla R (lub innych języków / oprogramowania), chciałbym trzymać się Pythona w tym zadaniu.

Ponadto na razie pracuję w środowisku Windows. Chciałbym kontynuować piaskownicę w systemie Windows na małych plikach dziennika, ale w razie potrzeby mogę przejść do środowiska Linux.

Zasoby: Sprawdziłem następujące z ślepymi zaułkami jako wyniki:

  1. Python lub R do implementacji algorytmów uczenia maszynowego do wykrywania oszustw . Niektóre informacje tutaj są pomocne, ale niestety staram się znaleźć odpowiedni pakiet, ponieważ:

  2. „AnomalyDetection” na Twitterze jest w R i chcę trzymać się Pythona. Co więcej, osobliwość portu Python wydaje mi się powodować problemy z implementacją w środowisku Windows.

  3. Wydaje się, że Skyline, moja kolejna próba, została w zasadzie przerwana (z powodu problemów z githubem ). Nie zagłębiłem się głęboko w to, biorąc pod uwagę, jak mało wsparcia wydaje się być dostępne online.

  4. scikit-learn Nadal badam, ale wydaje się, że jest to znacznie bardziej ręczne. Podejście do chwastów jest dla mnie OK, ale moje doświadczenie w narzędziach do nauki jest słabe, więc chciałbym coś w rodzaju czarnej skrzynki dla aspektów technicznych, takich jak algorytmy, podobne do Splunk + Prelert.

Definicja problemu i pytania: Szukam oprogramowania typu open source, które może mi pomóc w automatyzacji procesu wykrywania anomalii na podstawie plików dziennika szeregów czasowych w Pythonie za pomocą pakietów lub bibliotek.

  1. Czy istnieją takie rzeczy, które pomagają w moim bezpośrednim zadaniu, czy też są w mojej wyobraźni?
  2. Czy ktoś może pomóc w konkretnych krokach, które pomogą mi osiągnąć mój cel, w tym podstawowych podstaw lub koncepcji?
  3. Czy jest to najlepsza społeczność StackExchange, do której można się zwrócić, czy statystyki, matematyka, a nawet bezpieczeństwo lub Stackoverflow są lepszymi opcjami?

EDYCJA [2015-07-23] Należy pamiętać, że najnowsza aktualizacja osobliwości wydaje się być naprawiona w środowisku Windows! Muszę jeszcze potwierdzić, ale powinno być kolejnym przydatnym narzędziem dla społeczności.

EDYCJA [2016-01-19] Drobna aktualizacja. Nie miałem czasu na pracę nad tym i na badania, ale cofam się, aby zrozumieć podstawy tego problemu, zanim kontynuuję badania w konkretnych szczegółach. Na przykład dwa konkretne kroki, które podejmuję:

  1. Począwszy od artykułów z Wikipedii dotyczących wykrywania anomalii [ https://en.wikipedia.org/wiki/Anomaly_detection ], pełne zrozumienie, a następnie przejście w górę lub w dół w hierarchii koncepcji innych powiązanych artykułów z Wikipedii, takich jak [ https: // en.wikipedia.org/wiki/K-nearest_neighbors_alameterm ], a następnie do [ https://en.wikipedia.org/wiki/Machine_learning ].

  2. Badanie technik we wspaniałych ankietach przeprowadzonych przez Chandola i in. 2009 „Anomaly Detection: A Survey” [ http://www-users.cs.umn.edu/~banerjee/papers/09/anomaly.pdf ] oraz Hodge i in. 2004 „Badanie metod wykrywania wartości odstających” [ http://eprints.whiterose.ac.uk/767/1/hodgevj4.pdf ].

Po tym, jak pojęcia zostaną lepiej zrozumiane (mam nadzieję, że pobawię się przykładami zabawek, idę rozwinąć praktyczną stronę), mam nadzieję zrozumieć, które narzędzia Python open source są bardziej odpowiednie dla moich problemów.


Polecam te filmy, jeśli dopiero zaczynasz Scikit: github.com/justmarkham/scikit-learn-videos
Harvey

Biblioteka H2O nie importuje się w tym module.

1
Twój problem jest źle zdefiniowany. To, co stanowi anomalię, może mieć wiele różnych znaczeń. Czy to odchylenie średniej? Czy to pewne wzorce zachowań? W każdym przypadku obowiązują różne metody. Musisz przyjrzeć się „wykrywaniu wartości odstających”, jeśli anomalia jest odchyleniem od średniej. Jeśli szukasz określonych wzorców, znacznie lepiej byłoby skorzystać z nadzorowanego algorytmu uczenia się, takiego jak sieci neuronowe.
Willem van Doesburg

1
Wiem, że chcesz Pythona, ale ELKI wydaje się być narzędziem do wykrywania anomalii.
Anony-Mousse

Odpowiedzi:


35

Wykrywanie anomalii lub wykrywanie zdarzeń można wykonać na różne sposoby:

Podstawowy sposób

Pochodna! Jeśli odchylenie sygnału od jego przeszłości i przyszłości jest duże, najprawdopodobniej masz zdarzenie. Można to uzyskać, znajdując duże przejścia przez zero w pochodnej sygnału.

Sposób statystyczny

Cokolwiek znaczy to jego zwykłe, podstawowe zachowanie. jeśli coś odbiega od średniej, oznacza to, że jest to wydarzenie. Należy pamiętać, że średnia w szeregach czasowych nie jest aż tak trywialna i nie jest stała, ale zmienia się zgodnie ze zmianami w szeregach czasowych, dlatego zamiast średniej należy zobaczyć „średnią ruchomą” . To wygląda tak:

Zdarzenia są pikami większymi niż 1 odchylenie standardowe od średniej ruchomej

Kod średniej ruchomej można znaleźć tutaj . W terminologii przetwarzania sygnałów stosuje się filtr dolnoprzepustowy , stosując średnią ruchomą.

Możesz postępować zgodnie z poniższym kodem:

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

Sposób probabilistyczny

Są bardziej wyrafinowane, szczególnie dla osób, które dopiero zaczynają uczenie maszynowe. Filtr Kalmana to świetny pomysł na znalezienie anomalii . Prostsze podejścia probabilistyczne wykorzystujące „oszacowanie największej wiarygodności” również działają dobrze, ale proponuję pozostać przy idei średniej ruchomej. Działa bardzo dobrze w praktyce.

Mam nadzieję, że mógłbym pomóc :) Powodzenia!


Dziękuję za wysiłki na rzecz głębokiej dyskusji. Chociaż programowanie nie wydaje się takie złe (mogę powiedzieć, że dość interesujące, aby zagłębić się w algorytmy), jestem ciekawy pakietów, które już są dostępne. Czy wiesz coś, co istnieje, co jest łatwe do zainstalowania? Pamiętaj, że to nie to samo, co proste wdrożenie, co, jak rozumiem, nie może być zagwarantowane. Jeśli uda mi się sprawić, że moje środowisko będzie funkcjonalne, uważam, że mogę je dopracować na podstawie przykładów z mojego zadania.
ximiki,

15

h2o ma moduł wykrywania anomalii i tradycyjnie kod jest dostępny w R.Jednak poza wersją 3 ma również podobny moduł dostępny w pythonie, a ponieważ h2o jest open source, może pasować do twojego rachunku.

Można zobaczyć przykład pracuje nad tutaj

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)

Dzięki! Nie rozważałem jeszcze tego pakietu - dodam go do listy kandydatów. Aby wyjaśnić, kiedy mówisz „poza wersją 3 ma również podobny moduł dostępny w Pythonie”, czy wiesz, czy moduł wykrywania anomalii H2O (poza wersją 3) jest dostępny w Pythonie, czy w jakimś innym module?
ximiki,

1
@ximik Cóż, przejrzałem dokumentację Pythona ich najnowszej wersji 3.0.0.26 ( h2o-release.s3.amazonaws.com/h2o/rel-shannon/26/docs-website/… ) i wygląda na to, że h2o.anomaly nie jest jeszcze dostępne w przeciwieństwie do interfejsu API R. Podniosłem pytanie w swojej grupie google ( groups.google.com/forum/#!topic/h2ostream/uma3UdpanEI ) i możesz to śledzić.
0xF,

1
Cóż, grupa wsparcia H2O odpowiedziała na to pytanie, a anomalia jest dostępna również w Pythonie. Przykład jest dostępny tutaj. github.com/h2oai/h2o-3/blob/master/h2o-py/tests/testdir_algos/…
0xF

Doskonały! dziękuję za zbadanie. zaktualizuję ten post z wynikami.
ximiki,

1
link do testu H2O już nie działa, ale istnieje (prawdopodobnie) równoważny: github.com/h2oai/h2o-3/blob/master/h2o-py/tests/testdir_algos/… (bezpośredni link do wersji w momencie pisania jest github.com/h2oai/h2o-3/blob/… )
Andre Holzner

11

Niedawno opracowałem zestaw narzędzi: Py thon O utlier D etection toolbox ( PyOD ). Zobacz GitHub .

Jest przeznaczony do identyfikowania odległych obiektów w danych za pomocą podejść zarówno bez nadzoru, jak i nadzorowanych. PyOD jest opisywany dla:

  • Ujednolicone interfejsy API, szczegółowa dokumentacja i interaktywne przykłady różnych algorytmów.
  • Zaawansowane modele, w tym sieci neuronowe / głębokie uczenie się i zespoły odstające.
  • Zoptymalizowana wydajność dzięki JIT i równoległości, jeśli to możliwe, przy użyciu numba i joblib. Kompatybilny zarówno z Python 2, jak i 3 (również kompatybilny z scikit-learn).

Oto kilka ważnych linków:

Jeśli użyjesz PyOD w publikacji naukowej, będziemy wdzięczni za cytowanie poniższej pracy

@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}
}

Obecnie jest poddawany przeglądowi w JMLR ( ścieżka do uczenia maszynowego typu open source). Zobacz przedruk .


Szybkie wprowadzenie

Zestaw narzędzi PyOD składa się z trzech głównych grup funkcji: (i) algorytmy wykrywania wartości odstających; (ii) struktury zbiorów odstających i (iii) funkcje narzędzia do wykrywania wartości odstających.

Indywidualne algorytmy wykrywania :

  • PCA : Analiza głównych składników (suma ważonych rzutowanych odległości do hiperpłaszczyzn wektorów własnych)
  • MCD : Minimum Covariance Determinant (użyj odległości mahalanobis jako wyników odstających)
  • OCSVM : Jednej klasy maszyny wektorowe wsparcia
  • LOF : lokalny współczynnik odstający
  • CBLOF : Lokalny czynnik odstający oparty na klastrowaniu
  • LOCI : LOCI: Szybkie wykrywanie wartości odstających przy użyciu całki lokalnej korelacji
  • HBOS : Histogram Outlier Score
  • kNN : k Najbliżsi sąsiedzi (użyj odległości do k-tego najbliższego sąsiada jako - ** wynik odstający
  • AvgKNN : Średnia kNN (użyj średniej odległości do k najbliższych sąsiadów jako wyniku odstającego)
  • MedKNN : Mediana kNN (użyj mediany odległości do k najbliższych sąsiadów jako wyniku odstającego)
  • ABOD : Wykrywanie wartości odstających na podstawie kąta
  • FastABOD : Szybkie wykrywanie wartości odstających na podstawie kąta przy użyciu aproksymacji
  • SOS : Stochastic Outlier Selection
  • IForest : Isolation Forest
  • Funkcja pakowania
  • LSCP : LSCP: lokalnie selektywna kombinacja równoległych zestawów wartości odstających
  • XGBOD : Wykrywanie wartości odstających na podstawie ekstremalnego wzmocnienia (nadzorowane)
  • AutoEncoder : w pełni podłączony AutoEncoder (użyj błędu rekonstrukcji jako wyniku odstającego)
  • SO_GAAL : Aktywne uczenie się w trybie pojedynczego celu, generowanie przeciwników
  • MO_GAAL : Wieloobiektywne, generatywne aktywne uczenie się przeciwnika

Schematy kombinacji detektora / wyników Outlier :

  • Funkcja pakowania
  • LSCP : LSCP: lokalnie selektywna kombinacja równoległych zestawów wartości odstających
  • Średnia : prosta kombinacja przez uśrednienie wyników
  • Średnia ważona : prosta kombinacja przez uśrednienie wyników wagami detektora
  • Maksymalizacja : prosta kombinacja, biorąc maksymalną liczbę punktów
  • AOM : średnia z maksimum
  • MOA : Maksymalizacja średniej

Funkcje narzędzia do wykrywania wartości odstających :

  1. score_to_lable (): konwertuje surowe wyniki odstające na etykiety binarne
  2. precyzja_n_scores (): jeden z popularnych mierników oceny dla wydobywania wartości odstających (precyzja @ pozycja n)
  3. generuje_dane (): generuje pseudo-dane dla eksperymentu wykrywania wartości odstających
  4. wpearsonr (): ważony pearson jest przydatny w generowaniu pseudo-podstawowej prawdy

Porównanie wszystkich zaimplementowanych modeli jest dostępne poniżej: ( rysunek , kod , notebooki Jupyter ):wprowadź opis zdjęcia tutaj

Jeśli jesteś zainteresowany, sprawdź Github ( https://github.com/yzhao062/Pyod ), aby uzyskać więcej informacji.


8

Jestem obecnie na tej samej scenie jak ty. Znajduję najlepszą opcję wykrywania anomalii, przeprowadzając badania.

To, co znalazłem, wydaje mi się, że najlepiej pasuje do twoich potrzeb i lepiej jest porównać to, co widziałeś. tj. TwitterAnomalyDetection, SkyLine.

Znalazłem lepszy jest NAB Numenta (Numenta Anomaly Benchmark). Ma również bardzo dobre wsparcie społeczności, a dla ciebie plus jest otwarte oprogramowanie i opracowane w Pythonie. Możesz dodać do niego swój algorytm.

W przypadku algorytmu, LOF lub CBLOF są dobrą opcją.

więc sprawdź to raz. To może ci pomóc. https://github.com/numenta/nab

Jeśli znajdziesz lepszą opcję. Powiedz mi, Proszę. Jestem też na tej samej ścieżce.

Powodzenia !!


Dzięki za cenne informacje! Na pewno to sprawdzę.
ximiki

3
Chciałem tylko wrócić i skomentować, w jaki sposób odpowiedni NAB wydaje się moim problemem. Jedyną wadą, jaką dostrzegam, jest to, że dotyczy to wyłącznie wykrywania anomalii szeregów czasowych z jedną zmienną (jedna kolumna), ale co z wielowymiarowymi (wiele kolumn)? Dziękuję za tę sugestię, przekażę ją do krótkiej listy kandydatów na rozwiązania.
ximiki,

@ximiki, czy znalazłeś coś dla MultiVariate Time-Series. Patrzę też na podobny problem.
shubham003

7

1
Dziękuję za poświęcony czas, ale proszę zobaczyć mój pierwszy punkt „Zasoby”; Przejrzałem tę opcję i szukam czegoś, co spełnia moje „Ograniczenia”.
ximiki,

1
Aby powtórzyć i być może bardziej dosadnym, użycie pakietu AnomalyDetection na Twitterze NIE jest tutaj opcją: Przeczytaj uważniej sekcję „Ograniczenia”. Nie zamierzam potępiać żadnych szczerych prób pomocy w tym zakresie, ale pytanie dotyczy wyłącznie pakietów opartych na języku Python. Dlatego też przyszli wyborcy, PROSZĘ nie głosować za odpowiedzią, ponieważ nie jest to użyteczna opcja. Zalecałbym wyczyszczenie obecnych 2 głosów za to poprzez głosowanie w dół, ale być może jest to nieetyczne w społeczności Stackexchange i nie chcę łapać żadnego flacka.
ximiki,

1
Ponownie przepraszam za harfowanie na ten temat, ale po prostu staram się, aby to pytanie było bardzo jasne i użyteczne dla innych osób mających podobny problem i nie chcę, aby ścigały się z dziką gęś.
ximiki

6

Zakładam, że funkcją używaną do wykrywania nieprawidłowości jest jeden wiersz danych w pliku dziennika. Jeśli tak, Sklearn jest twoim dobrym przyjacielem i możesz go używać jako czarnej skrzynki. Zapoznaj się z samouczkiem wykrywania SVM jednej klasy i wykrywania nowości .

Jeśli jednak twoja funkcja jest całym plikiem dziennika, musisz najpierw podsumować ją dla jakiejś funkcji o tym samym wymiarze, a następnie zastosować wykrywanie Novealty.


3

Nadal istnieje aktywna i rozwinięta wersja Skyline, na wypadek, gdyby ktoś tu wylądował i był zainteresowany.

https://github.com/earthgecko/skyline

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

Jestem bieżącym opiekunem projektu i jest on teraz znacznie bardziej zaawansowany niż oryginalna wersja Etsy, pod względem wydajności, interfejsu użytkownika, lepszej obsługi sezonowości i ma dodatkowe funkcje bazy danych anomalii, obliczania korelacji i możliwości odcisków palców i uczyć się nietypowych wzorów.


1

Ponieważ masz wielowymiarowe szeregi czasowe, wybrałbym implementację LSTM-RNN, która modeluje dynamikę twojego systemu na podstawie danych treningowych, które zwykle są częściowo nadzorowane (tylko normalna klasa). Oznacza to, że trenujesz swój model, aby dowiedzieć się, co jest „normalne”. Podczas testowania testowane są zarówno warunki normalne, jak i anomalne, aby zobaczyć, jak dobrze model je rozróżnia.

Zaletą sieci neuronowych jest to, że same „uczą się” korelacji krzyżowych między sygnałami wejściowymi; nie musisz ich odkrywać ręcznie. W szczególności LSTM-RNN są idealnym wyborem, jeśli chodzi o modelowanie szeregów czasowych, po prostu ze względu na ich zdolność do zachowania pamięci poprzednich danych wejściowych, podobnie jak model przestrzeni stanów w teorii sterowania (jeśli widzisz analogię).

W Pythonie implementacja LSTM-RNN przy użyciu Keras API jest prawie banalna (na bazie backendu Tensorflow). Ta sieć uczy się szacować interesujący sygnał na podstawie dowolnej liczby sygnałów wejściowych, które następnie porównuje się z rzeczywistą zmierzoną wartością. Jeśli występuje „duże” odchylenie, masz anomalię (biorąc pod uwagę, że model jest wystarczająco dokładny)!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.