tło
Pracuję w Network Operations Center, monitorujemy systemy komputerowe i ich wydajność. Jednym z kluczowych wskaźników do monitorowania jest liczba odwiedzających \ klientów aktualnie podłączonych do naszych serwerów. Aby to pokazać, zbieramy takie dane, jak dane szeregów czasowych i rysujemy wykresy. Grafit pozwala nam to zrobić, ma dość bogaty interfejs API, którego używam do budowania systemu ostrzegania, aby powiadomić nasz zespół, jeśli nastąpi nagły spadek (głównie) i inne zmiany. Na razie ustawiłem próg statyczny na podstawie wartości średniej, ale nie działa on zbyt dobrze (istnieje wiele wyników fałszywie dodatnich) z powodu różnych obciążeń w ciągu dnia i tygodnia (współczynnik sezonowości).
Wygląda to mniej więcej tak:
Rzeczywiste dane (przykład dla jednej metryki, zakres czasu 15 min; pierwsza liczba to liczba użytkowników, druga sygnatura czasowa):
[{"target": "metric_name", "datapoints": [[175562.0, 1431803460], [176125.0, 1431803520], [176125.0, 1431803580], [175710.0, 1431803640], [175710.0, 1431803700], [175733.0, 1431803760], [175733.0, 1431803820], [175839.0, 1431803880], [175839.0, 1431803940], [175245.0, 1431804000], [175217.0, 1431804060], [175629.0, 1431804120], [175104.0, 1431804180], [175104.0, 1431804240], [175505.0, 1431804300]]}]
Co próbuję osiągnąć
Stworzyłem skrypt Pythona, który odbiera ostatnie punkty danych, porównuje je ze średnią historyczną i ostrzega o nagłej zmianie lub spadku. Z powodu sezonowości próg „statyczny” nie działa dobrze, a skrypt generuje fałszywe alarmy. Chcę ulepszyć algorytm ostrzegania, aby był bardziej precyzyjny i działał bez ciągłego dostrajania progu ostrzegania.
Czego potrzebuję i co odkryłem
Korzystając z googlingu, pomyślałem, że szukam algorytmów uczenia maszynowego do wykrywania anomalii (te nienadzorowane). Dalsze dochodzenie wykazało, że jest ich mnóstwo i bardzo trudno jest zrozumieć, który z nich ma zastosowanie w moim przypadku. Z powodu mojej ograniczonej wiedzy matematycznej nie potrafię czytać wyrafinowanych prac naukowych i szukam czegoś prostego dla początkującego w tej dziedzinie.
Lubię Pythona i trochę znam R, dlatego chętnie zobaczę przykłady dla tych języków. Proszę polecić dobrą książkę lub artykuł, który pomoże mi rozwiązać mój problem. Dziękuję za poświęcony czas i przepraszam za tak długi opis
Przydatne linki
Podobne pytania:
- Wykrywanie szeregów czasowych i anomalii
- Wykrywanie anomalii szeregów czasowych za pomocą Pythona
- Anomalie szeregów czasowych
- Algorytmy wykrywania anomalii szeregów czasowych
- Zastosowanie falek do algorytmów wykrywania anomalii opartych na szeregach czasowych
- Którego algorytmu powinienem użyć?
Zasoby zewnętrzne:
auto.arima
funkcji z doskonałegoforecast
pakietu R. (patrz jstatsoft.org/v27/i03/paper ). Możesz dostroić poziomy ufności, dostosowująclevel
parametr, npdata.model <- auto.arima(data.zoo, ic = c("bic")); data.prediction.warningLimits <- forecast(data.model, h=1, level=0.99)
.Odpowiedzi:
Myślę, że kluczem jest „nieoczekiwany” kwalifikator na twoim wykresie. Aby wykryć nieoczekiwane , musisz wiedzieć, czego się spodziewać .
Zaczynam od prostego modelu szeregów czasowych, takiego jak AR (p) lub ARMA (p, q). Dopasuj go do danych, dodaj sezonowość odpowiednio do potrzeb. Na przykład twoim modelem SAR (1) (24) może być: , gdzie oznacza czas w godzinach. Więc przewidujesz wykres na następną godzinę. Ilekroć błąd prognozy jest „za duży”, alert.yt= c + ϕ yt - 1+ Φ24yt - 24+ Φ25yt - 25+ εt t et=yt−y^t
Po oszacowaniu modelu otrzymasz wariancję błędu . W zależności od założeń dystrybucyjnych, takich jak normalne, można ustawić próg w oparciu o prawdopodobieństwo, takie jak dla 99,7% lub jednostronne .ε t | e t | < 3 σ ε e t > 3 σ εσε εt |et|<3σε et>3σε
Liczba odwiedzających jest prawdopodobnie dość trwała, ale bardzo sezonowa. Lepiej byłoby wypróbować manekiny sezonowe zamiast multiplikatywnej sezonowości, wtedy wypróbowałbyś ARMAX, gdzie X oznacza zmienne egzogeniczne, które mogą być niczym manekin wakacyjny, manekin godzinowy, manekin weekendowy itp.
źródło
Na blogu technicznym Netflix znajduje się artykuł na temat ich narzędzia do wykrywania niezawodnych anomalii (RAD). http://techblog.netflix.com/2015/02/rad-outlier-detection-on-big-data.html
Zajmuje się sezonowością i zestawami danych o bardzo dużej objętości, więc może pasować do twoich wymagań. Kod jest open source Java i Apache Pig https://github.com/Netflix/Surus/blob/master/resources/examples/pig/rad.pig
Podstawowy algorytm oparty jest na solidnym PCA - patrz oryginalny artykuł tutaj: http://statweb.stanford.edu/~candes/papers/RobustPCA.pdf
źródło
Większość algorytmów wykrywania wartości odstających w pakiecie open source dotyczy danych biznesowych szeregów czasowych o niskiej częstotliwości, dane dotyczące częstotliwości dziennej / tygodniowej / miesięcznej. Wydaje się, że te dane dotyczą wyspecjalizowanego obszaru, który jest rejestrowany w kilka minut, więc nie jestem pewien, czy wykrycie wartości odstających typu open source byłoby pomocne. Możesz spróbować dostosować to podejście do swoich danych.
Poniżej przedstawiam niektóre dostępne podejścia do pakietów w open source
R
:Istnieją pakiety komercyjne, które mają dedykowane podejścia do prób wykrycia nieprawidłowości. Innym klasycznym podejściem jest TSAY za algorytm wykrywania seria poboczna czas, podobnie jak podejście Chen i Liu wykrywa różne typy skrajnych. Niedawno natknąłem się również na to komercyjne rozwiązanie programowe o nazwie metafor, które może być bardziej odpowiednie dla twoich danych.
Mam nadzieję, że to jest pomocne
źródło
Czy próbowałeś używać reguł statystycznej kontroli procesu (np. Western Electric http://en.wikipedia.org/wiki/Western_Electric_rules )?
Używam ich do danych szeregów czasowych - często z odrobiną intuicji na temat danych - aby ocenić, czy dane idą gdzieś, gdzie nie chcę. Podobnie jak w przykładzie, reguły te mówią, że jeśli delta / zmiana jest spójna w kilku punktach danych, oznacza to, że może występować problem.
Również statystyczna kontrola procesu (SPC) może być przydatna do ćwiczenia, jeśli czujesz się lepiej lub gorzej niż wcześniej.
Jednym z problemów związanych z SPC jest to, że wiele z nich zależy od normalnej dystrybucji, która prawdopodobnie nie pasuje do twoich danych, która nie może spaść poniżej zera. Inni lepiej niż ja z SPC mogą tutaj sugerować opcje. Lubię używać go do oznaczania problemu, ale podobnie jak wszystkie modele, najlepiej jest go używać z dużą ilością wiedzy na temat samych danych (i źródła).
źródło
Innych odpowiedzi, o których nie wspominano, jest to, że twój problem brzmi jak wykrycie punktu zmiany . Ideą wykrywania zmiennego punktu jest to, że szukasz segmentów w swoich danych, które znacznie różnią się pod względem właściwości (np. Średnia, wariancja). Można to osiągnąć stosując moje oszacowanie maksymalnego prawdopodobieństwa, gdzie dla punktów wymiany jest funkcja prawdopodobieństwam
gdzie to twoje dane, są punktami granicznymi zaznaczającymi zmiany, a rozkłady prawdopodobieństwa są parametryzowane przez dla każdego segmentu. Można to łatwo uogólnić, aby zobaczyć różne sytuacje. Istnieje szereg algorytmów do wyszukiwania parametrów, w tym do znalezienia nieznanego . Dostępne jest również oprogramowanie do szacowania takich modeli, np. Pakiet dla R. Jeśli chcesz dowiedzieć się więcej, możesz sprawdzić następujące publikacje i odnośniki: 1 < τ 1 < ⋯ < τ m < n p θ i i my1,…,yn 1<τ1<⋯<τm<n p θi i m
changepoint
źródło
Biorąc pod uwagę, że okresowość szeregów czasowych powinna być dobrze zrozumiana, można opracować prosty, ale skuteczny algorytm oparty na różnicowaniu.
Proste różnicowanie w jednym kroku wykryje nagły spadek od poprzedniej wartości
ale jeśli seria ma silny składnik okresowy, można oczekiwać, że spadek ten będzie znaczny regularnie. W takim przypadku lepiej byłoby porównać dowolną wartość z jej odpowiednikiem w tym samym punkcie poprzedniego cyklu, tj. Jeden okres temu.
W przypadku zamieszczonego pytania byłoby naturalne oczekiwać dwóch istotnych składników okresowych, jednego o długości jednego dnia, drugiego o długości tygodnia. Nie jest to jednak zbyt skomplikowane, ponieważ długość dłuższego okresu można starannie podzielić przez długość krótszego.
Jeśli spadki mają charakter bardziej proporcjonalny, prosta różnica z łatwością nie wykryje nagłego spadku, gdy aktywność jest niska. W takich okolicznościach algorytm można zmodyfikować w celu obliczenia współczynników.
Zrobiłem kilka testów w R przy użyciu symulowanego zestawu danych. Próbkowane są w nim dane 6 razy dziennie i występują silne okresy dzienne i tygodniowe, a także inne zakłócenia i fluktuacje. Krople dodawano w losowych miejscach o czasie trwania od 1 do 3.
Aby wyodrębnić krople, najpierw obliczono stosunki w odległości 42, a następnie wartość progową ustaloną na 0,6, ponieważ interesująca jest tylko ujemna zmiana określonego rozmiaru. Następnie obliczono różnicę o jeden krok i próg ustalono na -0,5. W końcu jeden fałszywie pozytywny przeszedł przez (ten pod koniec 16 tygodnia). Wykresy po lewej i prawej stronie pokazują te same dane, tylko na różne sposoby.
źródło
Czy bardziej użyteczne byłoby myślenie o zmianach w szeregu czasowym raczej jako początek nowego trendu niż anomalii? Zrozumienie różnicy między sąsiednimi punktami pomogłoby stwierdzić, kiedy nachylenie (pochodna) zmienia się i może sygnalizować początek nowego trendu w dacie. Przydatne może być również uwzględnienie różnic wartości różnic (druga pochodna). Wyszukiwanie w Google „początkowego trendu w szeregu czasowym” może dać dobre sugestie dotyczące metod. W danych finansowych późno zwraca się uwagę na nowe trendy (kupujesz lub sprzedajesz?), Więc są artykuły na ten temat.
Dobrym wstępem do wavelet jest „Świat według fal” Hubbarda, który, jak sądzę, jest autorem.
źródło
Udało mi się uzyskać dobre wyniki dla szeregów czasowych z wieloma sezonami (codziennie, co tydzień) przy użyciu dwóch różnych algorytmów:
STL dokonuje rozkładu domeny szeregów czasowych na składnik trendu, pojedynczy składnik sezonowy i pozostałą część. Element sezonowy to twoja sezonowość wysokich częstotliwości (np. Codziennie), podczas gdy trend obejmuje zarówno sezonowość niskiej częstotliwości (np. Tygodniowo), jak i właściwy trend. Możesz je rozdzielić, po prostu ponownie uruchamiając STL dla trendu. W każdym razie, gdy odizolujesz pozostałe serie od innych komponentów, możesz przeprowadzić wykrywanie anomalii względem tej serii.
Tutaj napisałem bardziej szczegółowy:
https://techblog.expedia.com/2016/07/28/applying-data-science-to-monitoring/
źródło
Zainspirowany Davidem, czy próbowałeś użyć FFT? Może być w stanie wykryć nagłe spadki, ponieważ wskazują one na twoje anomalie. Anomalie mogą pojawić się w wąskim spektrum. Możesz więc łatwo je uchwycić.
źródło