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.
Odpowiedzi:
Myślę, że przydatne może być podejście podobne do statystycznej kontroli procesu , z kartami kontrolnymi itp.
źródło
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/
źródło
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.
źródło