Faszinierende Aspekte von Zeitreihen sind die intrinsische Komplexität einer scheinbar einfachen Artwork von Daten.
Letztendlich haben Sie in Zeitreihen eine x-Achse, die normalerweise die Zeit
Allerdings verbirgt sich die Komplexität in der Entwicklung der interessierenden Menge (y-Achse) über die Zeit (x-Achse). Stellt diese Entwicklung eine dar? Development? Hat es welche? Datenpunkte die deutlich vom erwarteten Sign abweichen? Ist es stabil oder unvorhersehbar? Ist der Durchschnittswert der Menge größer als wir erwarten würden? Diese können alle irgendwie definiert werden als Anomalien.
Dieser Artikel ist eine Sammlung verschiedener Techniken zur Anomalieerkennung. Das Ziel besteht darin, dass wir anhand eines Datensatzes mit mehreren Zeitreihen erkennen können welche Zeitreihe ist anomal und Warum.
Dies sind die 4 Zeitreihenanomalien, die wir erkennen werden:
- Wir werden jeden Development in unserer Zeitreihe erkennen (Trendanomalie)
- Wir werden bewerten, wie volatil die Zeitreihe ist (Volatilitätsanomalie).
- Wir werden die Punktanomalien innerhalb der Zeitreihe erkennen (Einzelpunktanomalie).
- Wir werden die Anomalien innerhalb unserer Signalbank erkennen, um zu verstehen, welches Sign sich anders verhält als unser Signalsatz (Anomalie auf Datensatzebene).

Wir werden jede Anomalieerkennungsmethode aus dieser Sammlung theoretisch beschreiben und die Python-Implementierung zeigen. Der gesamte Code, den ich für diesen Weblog-Beitrag verwendet habe, ist im enthalten PieroPaialungaAI/timeseriesanomaly GitHub-Ordner
0. Der Datensatz
Um den Anomalie-Kollektor zu erstellen, benötigen wir einen Datensatz, in dem wir genau wissen, nach welcher Anomalie wir suchen, damit wir wissen, ob unser Anomalie-Detektor funktioniert oder nicht. Um das zu erreichen, habe ich eine erstellt knowledge.py Skript. Das Skript enthält ein DataGenerator-Objekt, das:
- Liest die Konfiguration unseres Datensatzes aus einer config.json*-Datei.
- Erstellt ein Datensatz von Anomalien
- Gibt Ihnen die Möglichkeit, es einfach zu machen speichern die Daten und Handlung ihnen.
Dies ist der Codeausschnitt:

Wir können additionally sehen, dass wir Folgendes haben:
- Eine geteilte Zeitachsevon 0 bis 100
- Mehrere Zeitreihen die eine Zeitreihe bilden Datensatz
- Jede Zeitreihe präsentiert einen oder mehrere Anomalien.
Die Anomalien sind erwartungsgemäß:
- Das Trendverhaltenwobei die Zeitreihen ein lineares oder polynomielles Verhalten aufweisen
- Die Volatilitätwobei die Zeitreihe volatiler und sich ändernder als regular ist
- Der Ebenenwechselwobei die Zeitreihe einen höheren Durchschnitt als regular aufweist
- Eine Punktanomaliewobei die Zeitreihe einen anomalen Punkt hat.
Unser Ziel wird es nun sein, eine zu haben Werkzeugkasten Dadurch kann jede einzelne dieser Anomalien für den gesamten Datensatz identifiziert werden.
*Mit der Datei config.json können Sie alle Parameter unseres Datensatzes ändern, z. B. die Anzahl der Zeitreihen, die Zeitreihenachse und die Artwork der Anomalien. So sieht es aus:
1. Identifizierung von Trendanomalien
1.1 Theorie
Wenn wir „eine Trendanomalie“ sagen, suchen wir nach einer Strukturelles Verhalten: Die Reihe bewegt sich im Laufe der Zeit nach oben oder unten oder sie biegt sich gleichmäßig ab. Dies ist bei realen Daten wichtig, da Drift häufig eine Verschlechterung des Sensors, eine Änderung des Benutzerverhaltens, Probleme mit dem Modell/der Datenpipeline oder ein anderes zugrunde liegendes Phänomen bedeutet, das in Ihrem Datensatz untersucht werden muss.
Wir betrachten zwei Arten von Traits:
- Lineare Regression: Wir passen die Zeitreihe mit einem linearen Development an
- Polynomielle Regression: Wir passen die Zeitreihe mit einem Polynom niedrigen Grades an.
In der Praxis messen wir den Fehler des linearen Regressionsmodells. Wenn es zu groß ist, passen wir die Polynomregression an. Wir betrachten einen Development als „signifikant“, wenn der p-Wert unter einem festgelegten Schwellenwert liegt (üblicherweise p < 0,05).
1.2 Code
Das AnomalyDetector-Objekt in anomaly_detector.py führt den oben beschriebenen Code mit den folgenden Funktionen aus:
- Der Detektorwodurch die Daten geladen werden, die wir in DataGenerator generiert haben.
- discover_trend_anomaly Und alle_Trends erkennen Erkennen Sie den (letzten) Development für eine einzelne Zeitreihe bzw. für den gesamten Datensatz
- get_series_with_trend Gibt die Indizes zurück, die einen signifikanten Development aufweisen.
Wir können verwenden plot_trend_anomalies um die Zeitreihe anzuzeigen und zu sehen, wie es uns geht:

Intestine! So können wir die „trendigen“ Zeitreihen in unserem Datensatz fehlerfrei abrufen. Lass uns weitermachen!
2. Identifizierung von Volatilitätsanomalien
2.1 Theorie
Da wir nun einen globalen Development haben, können wir uns darauf konzentrieren Volatilität. Was ich mit Volatilität meine, ist im Klartext: Wie überall ist unsere Zeitreihe? Genauer gesagt, Wie verhält sich die Varianz der Zeitreihe im Vergleich zum Durchschnitt unseres Datensatzes?
So testen wir diese Anomalie:
- Wir werden es tun Entfernen Sie den Development aus dem Zeitreihendatensatz.
- Wir werden das finden Statistik der Varianz.
- Wir werden das finden Ausreißer dieser Statistiken
Ziemlich einfach, oder? Lassen Sie uns mit dem Code eintauchen!
2.2 Code
Ähnlich wie bei den Traits haben wir Folgendes getan:
- discover_volatility_anomalydas prüft, ob eine bestimmte Zeitreihe eine Volatilitätsanomalie aufweist oder nicht.
- alle_Volatilitäten erkennenUnd get_series_with_high_volatilitydie die gesamten Zeitreihendatensätze auf Volatilitätsanomalien überprüfen und jeweils die anomalen Indizes zurückgeben.
So zeigen wir die Ergebnisse an:

3. Einzelpunktanomalie
3.1 Theorie
Okay, jetzt ignorieren wir alle anderen Zeitreihen des Datensatzes und konzentrieren uns auf jede Zeitreihe nach der anderen. Für unsere Zeitreihe von Interesse möchten wir sehen, ob dies der Fall ist eins Punkt, der eindeutig anomal ist. Es gibt viele Möglichkeiten, dies zu tun; Wir können Transformers, 1D CNN, LSTM, Encoder-Decoder usw. nutzen. Der Einfachheit halber verwenden wir einen sehr einfachen Algorithmus:
- Wir werden eine adoptieren Rollfenster Ansatz, bei dem sich ein Fenster mit fester Größe von hyperlinks nach rechts bewegt
- Für jeden Punkt berechnen wir die bedeuten Und Standardabweichung des umgebenden Fensters (mit Ausnahme des Punktes selbst)
- Mithilfe von berechnen wir, wie viele Standardabweichungen der Punkt von seiner lokalen Nachbarschaft entfernt ist Z-Rating
Wir definieren einen Punkt als anomal wenn es einen festen Z-Rating-Wert überschreitet. Wir werden Z-Rating = 3 verwenden, was das Dreifache der Standardabweichungen bedeutet.
3.2 Code
Ähnlich wie wir es für Traits und Volatilität getan haben, haben wir Folgendes:
- discover_point_anomalydas mithilfe der Rolling-Window-Z-Rating-Methode prüft, ob eine bestimmte Zeitreihe Einzelpunktanomalien aufweist.
- discover_all_point_anomalies Und get_series_with_point_anomaliesdie den gesamten Zeitreihendatensatz auf Punktanomalien überprüfen und jeweils die Indizes von Reihen zurückgeben, die mindestens einen anomalen Punkt enthalten.
Und so funktioniert es:

4. Anomalie auf Datensatzebene
4.1 Theorie
Dieser Teil ist bewusst einfach gehalten. Hier sind wir nicht Auf der Suche nach seltsamen Zeitpunkten, nach denen wir suchen seltsame Signale in der Financial institution. Was wir beantworten wollen, ist:
Gibt es Zeitreihen, deren Gesamtgröße deutlich größer (oder kleiner) ist als das, was wir angesichts des Rests des Datensatzes erwarten?
Dazu komprimieren wir jede Zeitreihe zu einer einzigen „Basiszahl“ (einem typischen Niveau) und vergleichen diese Basislinien dann in der gesamten Financial institution. Der Vergleich erfolgt im Hinblick auf mittlere Und Z-Rating.
4.2 Code
So führen wir die Anomalie auf Datensatzebene durch:
- discover_dataset_level_anomalies()findet die Anomalie auf Datensatzebene im gesamten Datensatz.
- get_dataset_level_anomalies()findet die Indizes, die eine Anomalie auf Datensatzebene darstellen.
- plot_dataset_level_anomalies()zeigt eine Stichprobe von Zeitreihen an, die Anomalien aufweisen.
Dies ist der Code dazu:

5. Alle zusammen!
Okay, es ist Zeit, alles zusammenzustellen. Wir werden verwenden detector.detect_all_anomalies() und wir werden Anomalien für den gesamten Datensatz basierend auf bewerten Development, Volatilität, Single-Level Und Datensatzebene Anomalien. Das Skript hierfür ist sehr einfach:
Der df gibt Ihnen die Anomalie für jede Zeitreihe. So sieht es aus:
Wenn wir die folgende Funktion verwenden, können wir das in Aktion sehen:

Ziemlich beeindruckend, oder? Wir haben es geschafft. 🙂
6. Schlussfolgerungen
Vielen Dank, dass Sie Zeit mit uns verbringen, das bedeutet uns sehr viel. ❤️ Das haben wir gemeinsam gemacht:
- Erstellte ein kleines Toolkit zur Anomalieerkennung für a Financial institution von Zeitreihen.
- Erkannt Trendanomalien Verwenden der linearen Regression und der polynomialen Regression, wenn die lineare Anpassung nicht ausreicht.
- Erkannt Volatilitätsanomalien indem zuerst der Development entfernt und dann die Varianz im gesamten Datensatz verglichen wird.
- Erkannt Einzelpunktanomalien mit einem rollierenden Fenster-Z-Rating (einfach, schnell und überraschend effektiv).
- Erkannt Anomalien auf Datensatzebene durch Komprimieren jeder Reihe zu einer Basislinie (Median) und Markieren von Signalen, die auf einer anderen Größenskala leben.
- Alles zusammenfügen in einer einzelnen Pipeline, die eine saubere Übersichtstabelle zurückgibt, die wir prüfen oder darstellen können.
In vielen realen Projekten kommt man mit einer Toolbox wie der hier erstellten sehr weit, denn:
- Es gibt dir erklärbar Signale (Development, Volatilität, Basislinienverschiebung, lokale Ausreißer).
- Es gibt dir eine starke Grundlinie bevor Sie auf schwerere Modelle umsteigen.
- Es lässt sich intestine skalieren, wenn Sie es haben viele SignaleHier wird die Erkennung von Anomalien normalerweise schmerzhaft.
Bedenken Sie, dass die Basislinie absichtlich einfach ist und sehr einfache Statistiken verwendet. Die Modularität des Codes ermöglicht es Ihnen jedoch, die Komplexität einfach zu erhöhen, indem Sie einfach die Funktionalität hinzufügen anomaly_detector_utils.py Und anomaly_detector.py.
7. Bevor Sie losfahren!
Nochmals vielen Dank für Ihre Zeit. Es bedeutet viel ❤️
Mein Identify ist Piero Paialunga und ich bin dieser Typ hier:

Ich komme ursprünglich aus Italien und habe einen Doktortitel. aus dem Universität von Cincinnatiund arbeite als Datenwissenschaftler bei The Commerce Desk in New York Metropolis. Ich schreibe darüber KI, maschinelles Lernen und die sich entwickelnde Rolle von Datenwissenschaftlern sowohl hier auf TDS als auch auf LinkedIn. Wenn Ihnen der Artikel gefallen hat und Sie mehr über maschinelles Lernen erfahren und meine Studien verfolgen möchten, können Sie:
A. Folge mir weiter Linkedinwo ich alle meine Geschichten veröffentliche
B. Folge mir weiter GitHubwo Sie meinen gesamten Code sehen können
C. Bei Fragen können Sie mir eine E-Mail senden an piero.paialunga@hotmail
