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:
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:
- Zeitreihen- und Anomalieerkennung
- Zeitreihen-Anomalieerkennung mit Python
- Zeitreihenanomalien
- Algorithmen zur Erkennung von Zeitreihenanomalien
- Anwendung von Wavelets auf zeitreihenbasierte Anomalieerkennungsalgorithmen
- Welchen Algorithmus soll ich verwenden?
Externe Ressourcen:
auto.arima
Funktion aus dem hervorragendenforecast
Paket von R fortlaufend regelmäßige Vorhersagen erstellte (siehe jstatsoft.org/v27/i03/paper ). Sie können die Vertrauensstufen einstellenlevel
, indem Sie den Parameter anpassen , zdata.model <- auto.arima(data.zoo, ic = c("bic")); data.prediction.warningLimits <- forecast(data.model, h=1, level=0.99)
.Antworten:
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+ϕyt−1+Φ24yt−24+Φ25yt−25+εt t et=yt−y^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.
quelle
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
quelle
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
: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
quelle
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.
quelle
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
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,…,yn 1<τ1<⋯<τm<n p θi i m
changepoint
quelle
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
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.
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 = 168n 24∗7=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.
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.
quelle
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.
quelle
Mit zwei verschiedenen Algorithmen konnte ich einige gute Ergebnisse für Zeitreihen mit mehreren Jahreszeiten (täglich, wöchentlich) erzielen:
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/
quelle
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.
quelle