Wykrywanie anomalii szeregów czasowych za pomocą Pythona

10

Muszę wdrożyć wykrywanie anomalii w kilku zestawach danych szeregów czasowych. Nigdy wcześniej tego nie robiłem i liczyłem na radę. Bardzo dobrze czuję się w Pythonie, więc wolałbym, aby rozwiązanie było zaimplementowane w nim (większość mojego kodu to Python dla innych części mojej pracy).

Opis danych: to miesięczne dane szeregów czasowych, które dopiero zaczęły być gromadzone w ciągu ostatnich 2 lat (tj. Tylko 24–36 okresów). Zasadniczo istnieje kilka wskaźników monitorowanych co miesiąc dla kilku klientów.

time_period    client    metric    score
01-2013        client1   metric1   100
02-2013        client1   metric1   119
01-2013        client2   metric1   50
02-2013        client2   metric2   500
...

Oto, o czym myślę: ściągnij dane do ramki danych (pandy), a następnie oblicz kroczącą średnią z 6 miesięcy dla każdej pary klient / metryczny. Jeśli wartość bieżącego okresu przekracza pewien próg na podstawie średniej z 6 miesięcy, podnieś flagę. Problem wydaje się dość prosty. Chcę się tylko upewnić, że podchodzę solidnie.

Jakakolwiek rada, aby rozwinąć ten pomysł, byłaby bardzo mile widziana. Wiem, że pytanie jest nieco abstrakcyjne i przepraszam za to.

Eric Miller
źródło
Nie znam sposobu python, ale to pytanie jest pełne pomysłów dotyczących ogólnych podejść: stats.stackexchange.com/questions/26688/…
rapaio
pypi.org/project/anomaly-detection Jest to wbudowana biblioteka do wykrywania anomalii w pythonie, która jest podobna do wykrywania anomalii Twittera. Ponieważ kod wykrywania anomalii Twittera jest w języku R. Twoim problemem jest anomalia kontekstowa. Model Auto.arima też
saravanan saminathan

Odpowiedzi:

1

Myślę, że przydatne może być podejście podobne do statystycznej kontroli procesu , z kartami kontrolnymi itp.

czytnik babelproofreader
źródło
Przeczytam to. Czy ta metoda jest odpowiednia dla szeregów czasowych z niewielkimi ilościami danych (tj. 24 miesiące)?
Eric Miller,
skończyłem czytać większość. Zgodnie z tą metodą powinienem obliczyć 3 odchylenie standardowe dla szeregów czasowych i narysować linię na tych granicach. Jeśli wartość kiedykolwiek przekroczy te limity, oflaguj ją. To była metoda, którą rozważałem.
Eric Miller,
1

Istnieje wiele opcji wykrywania anomalii, od odchylenia standardowego przy użyciu funkcji odchylenia standardowego Pandas, po metodę bayesowską i wiele metod uczenia maszynowego między innymi: grupowanie, SVM, proces Gaussa, sieci neuronowe.

Obejrzyj ten samouczek: https://www.datascience.com/blog/python-anomaly-detection

Z perspektywy Bayesian polecam Facebook Prophet. Daje bardzo zaawansowane wyniki bez potrzeby bycia ekspertem od szeregów czasowych. Ma opcje pracy w miesiącach, dniach itp., A „przedziały niepewności” pomagają w anomaliach.

Na koniec polecam blogowi Uber na temat korzystania z sieci neuronowych (LSTM) do wykrywania anomalii, ma bardzo wgląd w towary: https://eng.uber.com/neural-networks/

Germán Alfaro
źródło
0

Jeśli chcesz założyć, że Twój zestaw danych jest normalnie dystrybuowany, możesz oszacować kwantyle tego rozkładu i sprawdzić, czy nie mieści się on np. W kwantylu 95%, 80% itp. Nie znam się zbyt dobrze na bibliotekach Python, ale jestem pewien, że istnieją już dla niego wbudowane funkcje.

Kevin Pei
źródło
Większość klientów ma tendencję wzrostową. Nie jestem pewien, czy można nazwać dane losowo.
Eric Miller
2
W takim razie nie. Wierzę, że metoda pode mną i twoja działałaby dobrze w tej sytuacji. Robiłem wcześniej coś podobnego: weź ruchomą średnią ruchomą okresu X, odejmij bieżącą wartość metryki od średniej ruchomej. Znajdź granice odchyleń standardowych (lub skorzystaj z subiektywnych danych wejściowych, jeśli wiesz, że w tym scenariuszu) tych resztkowych i wszystko powyżej lub poniżej tych granic można uznać za anomalię. Ta metoda działałaby dobrze, gdyby klient nagle zauważył wzrost wyniku.
Kevin Pei