Welchen Algorithmus sollte ich verwenden, um Anomalien in Zeitreihen zu erkennen?


70

Hintergrund

Ich arbeite im Network Operations Center. Wir überwachen Computersysteme und deren Leistung. Eine der wichtigsten zu überwachenden Messgrößen ist die Anzahl der Besucher / Kunden, die derzeit mit unseren Servern verbunden sind. Um dies sichtbar zu machen, sammeln wir (Ops-Team) Metriken wie Zeitreihendaten und zeichnen Diagramme. Graphite ermöglicht es uns, es hat eine ziemlich umfangreiche API, die ich verwende, um ein Warnsystem zu erstellen, um unser Team zu benachrichtigen, wenn plötzliche Stürze (meistens) und andere Änderungen auftreten. Im Moment habe ich einen statischen Schwellenwert festgelegt, der auf dem Durchschnittswert basiert, aber aufgrund der unterschiedlichen Belastung während des Tages und der Woche (Saisonalitätsfaktor) nicht sehr gut funktioniert (es gibt viele Fehlalarme).

Es sieht ungefähr so ​​aus: eine Anzahl von Benutzern pro System

Die tatsächlichen Daten (ein Beispiel für eine Metrik, 15 Minuten Zeitspanne; die erste Zahl ist die Anzahl der Benutzer, die zweite Zeitmarke):

[{"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]]}]

Was ich versuche zu erreichen

Ich habe ein Python-Skript erstellt, das die letzten Datenpunkte empfängt, sie mit dem historischen Durchschnitt vergleicht und bei plötzlichen Änderungen oder Stürzen benachrichtigt. Aufgrund der Saisonabhängigkeit funktioniert der "statische" Schwellenwert nicht gut und das Skript generiert falsch-positive Warnungen. Ich möchte einen Alarmierungsalgorithmus präziser gestalten und zum Funktionieren bringen, ohne den Alarmierungsschwellenwert ständig anzupassen.

Welchen Rat ich brauche und was ich entdeckt habe

Durch Googeln habe ich herausgefunden, dass ich nach Algorithmen zum maschinellen Lernen für die Erkennung von Anomalien suche (unbeaufsichtigte). Weitere Untersuchungen ergaben, dass es Unmengen davon gibt und es sehr schwer zu verstehen ist, welche davon in meinem Fall anwendbar ist. Aufgrund meiner begrenzten Mathematikkenntnisse kann ich keine anspruchsvollen wissenschaftlichen Arbeiten lesen und suche für Anfänger auf diesem Gebiet etwas Einfaches.

Ich mag Python und kenne mich ein bisschen mit R aus, daher freue ich mich über Beispiele für diese Sprachen. Bitte empfehlen Sie ein gutes Buch oder einen guten Artikel, um mein Problem zu lösen. Vielen Dank für Ihre Zeit und entschuldigen Sie mich für diese lange Beschreibung

Nützliche Links

Ähnliche Fragen:

Externe Ressourcen:


1
Haben Sie sich einen der einfachsten Algorithmen wie CUSUM angesehen?
Vladislavs Dovgalecs

@xeon, noch nicht. Ich bin neu im Thema und brauche etwas Zeit, um alles zu verdauen. Vielen Dank, dass Sie dieses
Thema angesprochen haben.

1
Das ist eine großartige Frage, @ ma-ge. Ich habe ein ähnliches Szenario. Mein Ansatz bestand darin, Warnungen einzurichten, indem ich mithilfe der auto.arimaFunktion aus dem hervorragenden forecastPaket von R fortlaufend regelmäßige Vorhersagen erstellte (siehe jstatsoft.org/v27/i03/paper ). Sie können die Vertrauensstufen einstellen level, indem Sie den Parameter anpassen , z data.model <- auto.arima(data.zoo, ic = c("bic")); data.prediction.warningLimits <- forecast(data.model, h=1, level=0.99).
Alex Woolford

3
Leute von Twitter haben einen sehr interessanten Artikel zu diesem Thema geschrieben. Check it out: blog.twitter.com/2015/…
ognjenz

Hey @IlyaKhadykin Hoffe es geht dir gut! Hast du jemals eine Lösung für dieses Problem gefunden? Ich mache genau dasselbe, in dem wir jede Minute bestimmte Benutzer haben und wir auch viele falsch positive erhalten. Ab sofort berechnen wir die Punktzahl für jeweils 5 Minuten Intervalldaten und gleichen sie mit dem Verlaufsmuster ab. WENN SIE EINEN BESTIMMTEN ALGORITHMUS ERHALTEN, KÖNNEN SIE BITTE TEILEN, WIE SIE ES TATEN. Danke im Voraus!
ak3191

Antworten:


24

Ich denke, der Schlüssel ist das "unerwartete" Qualifikationsmerkmal in Ihrem Diagramm. Um das Unerwartete zu erkennen , müssen Sie eine Vorstellung davon haben, was erwartet wird .

Ich würde mit einem einfachen Zeitreihenmodell wie AR (p) oder ARMA (p, q) beginnen. Passen Sie es an die Daten an und fügen Sie die Saisonalität entsprechend hinzu. Ihr SAR (1) (24) -Modell könnte beispielsweise sein: , wobei die Zeit in Stunden ist. Sie würden also das Diagramm für die nächste Stunde vorhersagen. Immer wenn der Vorhersagefehler "zu groß" ist, wird eine Warnung .yt=c+ϕyt1+Φ24yt24+Φ25yt25+εttet=yty^t

Wenn Sie das Modell schätzen, erhalten Sie die Varianz des Fehlers . Abhängig von Ihren Verteilungsannahmen, z. B. normal, können Sie den Schwellenwert basierend auf der Wahrscheinlichkeit festlegen, z. B. für 99,7% oder einseitig .σεεt|et|<3σεet>3σε

Die Besucherzahl ist wahrscheinlich recht anhaltend, aber super saisonal. Es könnte besser sein, saisonale Dummies anstelle der multiplikativen Saisonalität zu testen, dann würden Sie ARMAX ausprobieren, wobei X für exogene Variablen steht, wie etwa Urlaubs-Dummies, Stunden-Dummies, Wochenend-Dummies usw.


5
Bei diesem Ansatz wird von einem bestimmten ARIMA-Modell ausgegangen, bei dem die Parameter aufgrund der Anomalien verzerrt sind, von denen implizit angenommen wurde, dass sie nicht existieren. Ein allgemeinerer Ansatz wäre, AUCH zuerst die Anomalien zu identifizieren und dann ein optimales ARIMA-Modell, das zu Inline-Tests von Bedeutung führt. Zusätzliche Anomalien können Pegelverschiebungen, saisonale Impulse und lokale Zeittrends sein, die eine allgemeinere Lösung erfordern als hier vorgeschlagen. Eine umfassende Vorgehensweise finden Sie unter unc.edu/~jbhill/tsay.pdf . Sie können auch "Automatische Interventionserkennung" von Google verwenden, um weitere Informationen zu erhalten.
IrishStat

@IrishStat Ich habe ARIMAX mit Dummies für Events vorgeschlagen. OP kann bekannte Ereignisse wie Abstürze von Websites mit Dummies berücksichtigen. Dadurch wird die Fehlervarianz verringert und es werden mehr Warnungen ausgegeben. Es gibt keinen Grund, das komplizierte Modell zu erstellen, da es einfach unmöglich ist, alles zu berücksichtigen, was mit dem Website-Verkehr zu tun hat. Die einfachen Modelle funktionieren am besten.
Aksakal,

2
@ ma-ge, noch eine Sache: Vielleicht möchten Sie überlappende Intervalle verwenden. Angenommen, Sie erfassen Daten jede Minute, aber für die Modellierung können Sie einen Schritt in 10 Minuten auswählen. Es entstehen einige Probleme bei der Schätzung (aufgrund von Autokorrelation), aber das resultierende Modell wird höchstwahrscheinlich robuster sein.
Aksakal,

@Aksakal Models sollten so einfach wie nötig sein, aber nicht zu einfach.
IrishStat

17

Im Tech-Blog von Netflix gibt es einen Artikel über das Robust Anomaly Detection Tool (RAD). http://techblog.netflix.com/2015/02/rad-outlier-detection-on-big-data.html

Es befasst sich mit Saisonalität und Datasets mit sehr hohem Volumen, sodass es Ihren Anforderungen entsprechen kann. Der Code ist Open Source Java und Apache Pig https://github.com/Netflix/Surus/blob/master/resources/examples/pig/rad.pig

Der zugrunde liegende Algorithmus basiert auf einer robusten PCA - siehe Originalarbeit hier: http://statweb.stanford.edu/~candes/papers/RobustPCA.pdf


12

Die meisten Ausreißererkennungsalgorithmen in Open Source-Paketen beziehen sich auf Geschäftszeitreihendaten mit niederfrequenten täglichen / wöchentlichen / monatlichen Häufigkeitsdaten. Diese Daten scheinen für einen speziellen Bereich bestimmt zu sein, der in wenigen Minuten erfasst wird. Daher bin ich mir nicht sicher, ob die Erkennung von Open Source-Ausreißern hilfreich wäre. Sie könnten versuchen, diese Ansätze an Ihre Daten anzupassen.

Im Folgenden skizziere ich einige verfügbare Paketansätze in Open Source R:

  1. tsoutliers : Implementiert den Ausreißererkennungsalgorithmus von Chen und Liu im Rahmen von arima. Siehe meine frühere Frage auf dieser Seite. Fantastischer Ansatz, aber sehr langsam, nicht sicher, ob er Hochfrequenzdaten wie Ihre verarbeiten kann. Es hat den Vorteil, alle Arten von Ausreißern zu erkennen, wie in meiner früheren Frage / Post erwähnt.
  2. Erkennung von Twitter- Anomalien : Verwendet den Rosner- Algorithmus, um Anomalien anhand von Zeitreihen zu erkennen. Der Algorithmus zerlegt Zeitreihen und erkennt dann Anomalien. Meiner persönlichen Meinung nach ist dies bei der Ermittlung von Ausläufern in Zeitreihen nicht effizient und genau.
  3. tsoutlier in forecast package: Ähnlich wie der Algorithmus von Twitter hinsichtlich der Zerlegung von Zeitreihen und der Erkennung von Ausreißern. Nur erkennt additive Ausreißer oder Impulse.

Es gibt kommerzielle Pakete, die spezielle Ansätze haben, um Anomolien aufzuspüren. Ein weiterer klassischer Ansatz ist Tsays Ausreißererkennungsalgorithmus für Zeitreihen. Ähnlich wie bei Chen und Liu erkennt er verschiedene Arten von Ausreißern. Vor kurzem bin ich auch auf diese kommerzielle Softwarelösung namens metafor gestoßen, die möglicherweise besser für Ihre Daten geeignet ist.

Hoffe das ist hilfreich


Danke, es gibt mir eine Perspektive auf ähnliche Probleme und Ansätze; Besonderer Dank für die Links!
Ilya Khadykin

Wenn jemand nach Metafor sucht, wurden wir von Splunk übernommen. Unsere TSAD-Algorithmen sind in neueren Versionen von Splunk IT Service Intelligence ("ITSI") enthalten.
Alex Cruise

4

Haben Sie versucht, statistische Prozesskontrollregeln zu verwenden (z. B. Western Electric http://en.wikipedia.org/wiki/Western_Electric_rules )?

Ich verwende sie für Zeitreihendaten - oft mit einem Hauch von Intuition in Bezug auf die Daten -, um zu beurteilen, ob die Daten an einem Ort gespeichert sind, an dem sie nicht gespeichert werden sollen. Wie in Ihrem Beispiel besagen diese Regeln, dass, wenn das Delta / die Änderung über mehrere Datenpunkte hinweg konsistent ist, ein Problem vorliegen kann.

Auch die statistische Prozesskontrolle (SPC) kann sich als hilfreich erweisen, wenn Sie besser oder schlechter werden als zuvor.

Ein Problem mit SPC ist, dass ein Großteil davon auf einer normalen Verteilung beruht, die wahrscheinlich nicht zu Ihren Daten passt, die nicht unter Null gehen können. Andere, die besser sind als ich mit SPC, können hier Optionen vorschlagen. Ich benutze es gerne, um ein Problem zu kennzeichnen, aber wie alle Modelle wird es am besten mit einem Körnchen Wissen über die Daten selbst (und die Quelle) verwendet.


4

Die anderen Antworten scheinen nicht zu erwähnen, dass sich Ihr Problem wie eine Änderungspunkterkennung anhört . Die Idee der Änderungspunkterkennung ist, dass Sie in Ihren Daten nach Segmenten suchen, die sich in Bezug auf Eigenschaften (z. B. Mittelwert, Varianz) erheblich unterscheiden. Dies kann unter Verwendung der Maximum-Likelihood-Schätzung erreicht werden, wobei für Änderungspunkte die Likelihood-Funktion istm

L(m,τ1:m,θ1:(m+1))=i=1m+1p(y(τi1+1):τiθi)

Dabei sind Ihre Daten, die Grenzpunkte, die die Änderungen , und die Wahrscheinlichkeitsverteilungen werden für jedes Segment durch parametrisiert . Dies kann leicht auf verschiedene Situationen verallgemeinert werden. Es gibt eine Reihe von Algorithmen zum Auffinden der Parameter, einschließlich des Auffindens des unbekannten . Es gibt auch Software, mit der solche Modelle geschätzt werden können, z. B. ein Paket für R. Wenn Sie mehr darüber erfahren möchten, können Sie die folgenden Veröffentlichungen und die darin enthaltenen Referenzen überprüfen: 1 < τ 1 < < τ m < n p θ i i my1,,yn1<τ1<<τm<npθiimchangepoint

Rebecca Killick und Idris A. Eckley. (2013) changepoint: Ein R-Paket für die Changepoint-Analyse. (Online-Artikel)

Eckley, IA, Fearnhead, P. und Killick, R. (2011) Analyse von Changepoint-Modellen. [in:] Bayesian Time Series Models , Hrsg. D. Barber, AT Cemgil und S. Chiappa, Cambridge University Press.


4

Da die Periodizität der Zeitreihen gut verstanden werden sollte, kann ein einfacher, aber effektiver Algorithmus entwickelt werden, der auf Differenzierung basiert.

Eine einfache einstufige Differenzierung erkennt einen plötzlichen Abfall von einem vorherigen Wert

yt=ytyt1

Wenn die Serie jedoch eine starke periodische Komponente aufweist, ist davon auszugehen, dass dieser Rückgang regelmäßig erheblich sein wird. In diesem Fall ist es besser, einen Wert zum selben Zeitpunkt im vorherigen Zyklus, dh vor einer Periode, mit seinem Gegenüber zu vergleichen.

yt=ytytnwhere n=length of period

Im Falle der gestellten Frage ist es selbstverständlich, zwei signifikante periodische Komponenten zu erwarten, eine die Länge eines Tages, die andere die Länge einer Woche. Dies ist jedoch keine große Komplikation, da die Länge der längeren Periode genau durch die Länge der kürzeren geteilt werden kann.

Wenn die Abtastung stündlich erfolgt, sollte in der obigen Gleichung auf24 7 = 168n247=168

Wenn die Tropfen eher proportional sind, kann ein einfacher Unterschied einen plötzlichen Abfall bei geringer Aktivität leicht nicht erkennen. In solchen Fällen kann der Algorithmus geändert werden, um stattdessen Verhältnisse zu berechnen.

yt=ytytn

Ich habe einige Tests in R mit einem simulierten Datensatz durchgeführt. Darin werden Daten 6-mal täglich abgetastet und es gibt starke tägliche und wöchentliche Perioden, zusammen mit anderen Geräuschen und Schwankungen. Tropfen wurden an zufälligen Stellen und von Dauern zwischen 1 und 3 hinzugefügt.
Um die Tropfen zu isolieren, wurden die ersten Verhältnisse bei Abstand 42 berechnet, dann wurde ein Schwellenwert von 0,6 festgelegt, da nur eine negative Änderung einer bestimmten Größe von Interesse ist. Dann wurde eine einstufige Differenz berechnet und ein Schwellenwert von -0,5 eingestellt. Am Ende scheint ein falsches Positiv durchgerutscht zu sein (das Ende der 16. Woche). Die Grafiken links und rechts zeigen die gleichen Daten auf unterschiedliche Weise.

Bildbeschreibung hier eingeben


3

Wäre es sinnvoller, sich die Änderungen in der Zeitreihe als Beginn eines neuen Trends und nicht als Anomalie vorzustellen? Wenn Sie die Differenz zwischen benachbarten Punkten messen, können Sie erkennen, wann sich die Steigung (Ableitung) ändert, und möglicherweise den Beginn eines neuen Trendes im Datum signalisieren. Auch das Nehmen der Differenzen der Differenzwerte (der zweiten Ableitung) könnte von Nutzen sein. Eine Google-Suche nach "Zeitreihen-Beginn des Trends" kann gute Vorschläge für Methoden geben. In Finanzdaten wird neuen Trends (kaufen oder verkaufen Sie?) Zu spät Aufmerksamkeit geschenkt, daher gibt es Artikel zu diesem Thema.

Ein gutes Wavelet-Intro ist "Die Welt nach Wavelets" von Hubbard, von dem ich glaube, dass er der Autor ist.


2

Mit zwei verschiedenen Algorithmen konnte ich einige gute Ergebnisse für Zeitreihen mit mehreren Jahreszeiten (täglich, wöchentlich) erzielen:

  • Saisonale Trendzerlegung mit Löss (oder STL) zur Ermittlung der Mittelpunktsreihe.
  • Nichtlineare Regression zur Festlegung von Schwellenwerten um diesen Mittelpunkt, basierend auf der Beziehung zwischen der Varianz und dem Pegel.

STL zerlegt Ihre Zeitreihen im Zeitbereich in eine Trendkomponente, eine einzelne saisonale Komponente und einen Rest. Die saisonale Komponente ist Ihre Hochfrequenz-Saisonalität (z. B. täglich), während der Trend sowohl die Niedrigfrequenz-Saisonalität (z. B. wöchentlich) als auch den eigentlichen Trend umfasst. Sie können die beiden trennen, indem Sie STL erneut für den Trend ausführen. Sobald Sie die verbleibende Serie von den anderen Komponenten isoliert haben, können Sie die Anomalieerkennung für diese Serie durchführen.

Ich habe hier eine ausführlichere Beschreibung gemacht:

https://techblog.expedia.com/2016/07/28/applying-data-science-to-monitoring/


1

Haben Sie, inspiriert von David, versucht, FFT zu verwenden? Es könnte in der Lage sein, plötzliche Stürze zu erkennen, da diese auf Ihre Anomalien hinweisen. Die Anomalien können in einem engen Spektrum auftreten. So können Sie sie leicht erfassen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.