Résumé des méthodes de détection des anomalies des séries chronologiques

c20912e283ad6e03949e62dfe2dfb617.png

来源:算法进阶 kaggle竞赛宝典
本文约3100字,建议阅读5分钟
在本文中将探索各种方法来揭示时间序列数据中的异常模式和异常值。

Introduction

Les données de séries chronologiques sont une série d'observations enregistrées à certains intervalles de temps. On le rencontre souvent dans divers domaines tels que la finance, la météo, l'analyse boursière, etc. L'analyse des données de séries chronologiques peut fournir des informations précieuses et aider à prendre des décisions éclairées.

La détection des anomalies est le processus d'identification des modèles dans les données qui ne sont pas conformes au comportement attendu. Dans le contexte des données de séries chronologiques, les anomalies peuvent représenter des événements importants ou des valeurs aberrantes qui s'écartent des modèles normaux. La détection des anomalies dans les données de séries chronologiques est essentielle pour diverses applications, notamment la détection des fraudes, la surveillance du réseau et la maintenance prédictive.

Importons d'abord la bibliothèque, afin de faciliter l'acquisition des données, nous utilisons directement yfinance :

import numpy as np
 import pandas as pd
 import matplotlib.pyplot as plt
 import seaborn as sns
 import yfinance as yf


 # Download time series data using yfinance
 data = yf.download('AAPL', start='2018-01-01', end='2023-06-30')

Comprendre les données de séries chronologiques

Avant de plonger dans les techniques de détection d'anomalies, une brève introduction aux caractéristiques des données de séries chronologiques est donnée. Les données de séries chronologiques ont généralement les propriétés suivantes :

  • Tendance : l'augmentation ou la diminution à long terme des valeurs de données au fil du temps.

  • Saisonnalité : modèle ou cycle qui se répète à intervalles réguliers.

  • Autocorrélation : corrélation entre l'observation actuelle et les observations précédentes.

  • Bruit : Fluctuations ou irrégularités aléatoires dans les données.

Visualisons les données de séries chronologiques téléchargées

# Plot the time series data
 plt.figure(figsize=(12, 6))
 plt.plot(data['Close'])
 plt.xlabel('Date')
 plt.ylabel('Closing Price')
 plt.title('AAPL Stock Price')
 plt.xticks(rotation=45)
 plt.grid(True)


 plt.show()

882180fbd1fc348a785d47c3369fd643.png

La tendance de la croissance du cours des actions au fil du temps peut être observée à partir de la figure. Il existe également des fluctuations périodiques, indiquant la présence d'une saisonnalité. Il semble y avoir une certaine autocorrélation entre les prix de clôture consécutifs.

Prétraitement des données de séries chronologiques

Avant d'appliquer les techniques de détection d'anomalies, il est crucial de prétraiter les données des séries chronologiques. Le prétraitement comprend la gestion des valeurs manquantes, le lissage des données et la suppression des valeurs aberrantes.

valeur manquante

Des valeurs manquantes peuvent survenir dans les données de séries chronologiques pour diverses raisons telles que des erreurs de collecte de données ou des lacunes dans les données. Une bonne gestion des valeurs manquantes est essentielle pour éviter les biais dans l'analyse.

# Check for missing values
 missing_values = data.isnull().sum()
 print(missing_values)

Les données de stock que nous utilisons ne contiennent aucune valeur manquante. S'il y a des valeurs manquantes, elles peuvent être traitées en imputant des valeurs manquantes ou en supprimant les points temporels correspondants.

données lisses

Le lissage des données de séries chronologiques peut aider à réduire le bruit et à mettre en évidence les modèles sous-jacents. Une technique courante pour lisser les données de séries chronologiques est une moyenne mobile.

# Smooth the time series data using a moving average
 window_size = 7
 data['Smoothed'] = data['Close'].rolling(window_size).mean()


 # Plot the smoothed data
 plt.figure(figsize=(12, 6))
 plt.plot(data['Close'], label='Original')
 plt.plot(data['Smoothed'], label='Smoothed')
 plt.xlabel('Date')
 plt.ylabel('Closing Price')
 plt.title('AAPL Stock Price (Smoothed)')
 plt.xticks(rotation=45)
 plt.legend()
 plt.grid(True)


 plt.show()

5ac4c163d6a419c2d25b4d0bb8a0afd6.png

Le graphique montre le cours de clôture brut et une version lissée obtenue à l'aide d'une moyenne mobile. Le lissage permet de visualiser la tendance globale et de réduire l'impact des fluctuations à court terme.

supprimer les valeurs aberrantes

Les valeurs aberrantes anormales peuvent affecter de manière significative les performances des algorithmes de détection d'anomalies. Avant d'appliquer les techniques de détection d'anomalies, il est crucial d'identifier et de supprimer les valeurs aberrantes.

# Calculate z-scores for each data point
 z_scores = (data['Close'] - data['Close'].mean()) / data['Close'].std()


 # Define a threshold for outlier detection
 threshold = 3


 # Identify outliers
 outliers = data[np.abs(z_scores) > threshold]


 # Remove outliers from the data
 data = data.drop(outliers.index)


 # Plot the data without outliers
 plt.figure(figsize=(12, 6))
 plt.plot(data['Close'])
 plt.xlabel('Date')
 plt.ylabel('Closing Price')
 plt.title('AAPL Stock Price (Without Outliers)')
 plt.xticks(rotation=45)
 plt.grid(True)


 plt.show()

21d54001fa34f6871d9bf8996c71df8e.png

La figure ci-dessus montre les données de la série chronologique après suppression des valeurs aberrantes identifiées. La suppression des valeurs aberrantes permet d'améliorer la précision des algorithmes de détection d'anomalies en réduisant l'influence des valeurs extrêmes.

Certaines personnes diront, ne voulons-nous pas simplement détecter les valeurs aberrantes, pourquoi devrions-nous les supprimer ? En effet, les valeurs aberrantes que nous supprimons ici sont des valeurs très évidentes, c'est-à-dire que ce prétraitement est un criblage préliminaire, ou criblage grossier. Supprimez les valeurs très évidentes afin que le modèle puisse mieux juger quelles valeurs sont difficiles à juger.

Méthodes statistiques

Les méthodes statistiques constituent la base de la détection des anomalies dans les données de séries chronologiques. Nous explorerons deux techniques statistiques couramment utilisées : le score z et la moyenne mobile.

score z

Le score z mesure le nombre d'écarts types entre une observation et la moyenne. En calculant un score z pour chaque point de données, nous pouvons identifier les observations qui s'écartent considérablement du comportement attendu.

# Calculate z-scores for each data point
 z_scores = (data['Close'] - data['Close'].mean()) / data['Close'].std()


 # Plot the z-scores
 plt.figure(figsize=(12, 6))
 plt.plot(z_scores)
 plt.xlabel('Date')
 plt.ylabel('Z-Score')
 plt.title('Z-Scores for AAPL Stock Price')
 plt.xticks(rotation=45)
 plt.axhline(y=threshold, color='r', linestyle='--', label='Threshold')
 plt.axhline(y=-threshold, color='r', linestyle='--')
 plt.legend()
 plt.grid(True)


 plt.show()

fdeeac34e65dd812ddeec6a47014f3bf.png

Le graphique montre le score z calculé pour chaque point de données. Les observations avec un score z supérieur à un seuil (ligne rouge pointillée) peuvent être considérées comme anormales.

moyenne mobile

Une autre approche statistique de la détection des anomalies est basée sur les moyennes mobiles. En calculant une moyenne mobile et en la comparant aux données brutes, nous pouvons identifier les écarts par rapport au comportement attendu.

# Calculate the moving average
 window_size = 7
 moving_average = data['Close'].rolling(window_size).mean()


 # Calculate the deviation from the moving average
 deviation = data['Close'] - moving_average


 # Plot the deviation
 plt.figure(figsize=(12, 6))
 plt.plot(deviation)
 plt.xlabel('Date')
 plt.ylabel('Deviation')
 plt.title('Deviation from Moving Average')
 plt.xticks(rotation=45)
 plt.axhline(y=0, color='r', linestyle='--', label='Threshold')
 plt.legend()
 plt.grid(True)


 plt.show()

fae16d5274e07152a0421371eca34cbd.png

Le graphique montre l'écart de chaque point de données par rapport à la moyenne mobile. Les écarts positifs indiquent des valeurs supérieures au comportement attendu, tandis que les écarts négatifs indiquent des valeurs inférieures au comportement attendu.

méthode d'apprentissage automatique

Les méthodes d'apprentissage automatique fournissent des techniques plus avancées pour la détection d'anomalies dans les données de séries chronologiques. Nous explorerons deux algorithmes d'apprentissage automatique populaires : Isolation Forest et LSTM Autoencoder.

forêt isolée

Isolation Forest est un algorithme d'apprentissage automatique non supervisé qui isole les anomalies en partitionnant de manière aléatoire les données en sous-ensembles. Il mesure le nombre moyen de partitions nécessaires pour isoler les observations, tandis que les anomalies devraient nécessiter moins de partitions.

from sklearn.ensemble import IsolationForest


 # Prepare the data for Isolation Forest
 X = data['Close'].values.reshape(-1, 1)


 # Train the Isolation Forest model
 model = IsolationForest(contamination=0.05)
 model.fit(X)


 # Predict the anomalies
 anomalies = model.predict(X)


 # Plot the anomalies
 plt.figure(figsize=(12, 6))
 plt.plot(data['Close'])
 plt.scatter(data.index, data['Close'], c=anomalies, cmap='cool', label='Anomaly')
 plt.xlabel('Date')
 plt.ylabel('Closing Price')
 plt.title('AAPL Stock Price with Anomalies (Isolation Forest)')
 plt.xticks(rotation=45)
 plt.legend()
 plt.grid(True)


 plt.show()

df1300cf479fcd6e4a84730435a879d3.png

Cette figure montre les données de séries temporelles anormales identifiées par l'algorithme Isolation Forest. Les anomalies sont mises en évidence avec une couleur différente pour indiquer qu'elles s'écartent du comportement attendu.

Auto-encodeur LSTM

Les auto-encodeurs LSTM (Long - Short-Term Memory) sont des modèles d'apprentissage en profondeur capables d'apprendre des modèles dans des données de séries chronologiques et de reconstruire des séquences d'entrée. Les anomalies peuvent être détectées en comparant l'erreur de reconstruction à des seuils prédéfinis.

from tensorflow.keras.models import Sequential
 from tensorflow.keras.layers import LSTM, Dense


 # Prepare the data for LSTM Autoencoder
 X = data['Close'].values.reshape(-1, 1)


 # Normalize the data
 X_normalized = (X - X.min()) / (X.max() - X.min())


 # Train the LSTM Autoencoder model
 model = Sequential([
    LSTM(64, activation='relu', input_shape=(1, 1)),
    Dense(1)
 ])
 model.compile(optimizer='adam', loss='mse')
 model.fit(X_normalized, X_normalized, epochs=10, batch_size=32)


 # Reconstruct the input sequence
 X_reconstructed = model.predict(X_normalized)


 # Calculate the reconstruction error
 reconstruction_error = np.mean(np.abs(X_normalized - X_reconstructed), axis=1)


 # Plot the reconstruction error
 plt.figure(figsize=(12, 6))
 plt.plot(reconstruction_error)
 plt.xlabel('Date')
 plt.ylabel('Reconstruction Error')
 plt.title('Reconstruction Error (LSTM Autoencoder)')
 plt.xticks(rotation=45)
 plt.axhline(y=threshold, color='r', linestyle='--', label='Threshold')
 plt.legend()
 plt.grid(True)


 plt.show()

02193b7b2c299f820fb32bf5e8194b8d.png

Le graphique montre l'erreur de reconstruction pour chaque point de données. Les observations avec des erreurs de reconstruction supérieures à un seuil (ligne rouge pointillée) peuvent être considérées comme des anomalies.

Évaluation des modèles de détection d'anomalies

Pour évaluer avec précision les performances des modèles de détection d'anomalies, des données étiquetées contenant des informations sur la présence ou l'absence d'anomalies sont nécessaires. Mais dans les scénarios du monde réel, il est presque impossible d'obtenir des données étiquetées avec des anomalies connues, de sorte que des techniques alternatives peuvent être utilisées pour évaluer l'efficacité de ces modèles.

L'une des techniques les plus couramment utilisées est la validation croisée, qui consiste à diviser les données étiquetées disponibles en sous-ensembles, ou plis. Un modèle est formé sur une partie des données et évalué sur la partie restante. Ce processus est répété plusieurs fois et les évaluations sont moyennées pour obtenir une estimation plus fiable de la performance du modèle.

Des métriques d'évaluation non supervisées peuvent également être utilisées lorsque les données étiquetées ne sont pas facilement disponibles. Ces métriques évaluent les performances des modèles de détection d'anomalies en fonction de caractéristiques inhérentes aux données elles-mêmes, telles que le regroupement ou les estimations de densité. Des exemples de métriques d'évaluation non supervisées incluent le score de silhouette, l'indice de Dunn ou la distance moyenne du plus proche voisin.

Résumer

Cet article explore diverses techniques de détection d'anomalies de séries chronologiques à l'aide de l'apprentissage automatique. Il est d'abord prétraité pour gérer les valeurs manquantes, lisser les données et supprimer les valeurs aberrantes. Les méthodes statistiques de détection d'anomalies, telles que les scores z et les moyennes mobiles, sont ensuite discutées. Il se termine par une discussion sur les méthodes d'apprentissage automatique, y compris les forêts d'isolement et les auto-encodeurs LSTM.

La détection des anomalies est une tâche difficile qui nécessite une compréhension approfondie des données de séries chronologiques et l'utilisation de techniques appropriées pour repérer les modèles inhabituels et les valeurs aberrantes. N'oubliez pas d'essayer différents algorithmes, d'affiner les paramètres et d'évaluer les performances de votre modèle pour obtenir les meilleurs résultats.

Editeur : Yu Tengkai

Relecture : Lin Yilin

61b5d2be5e706d27e883952092e0e16f.png

Je suppose que tu aimes

Origine blog.csdn.net/tMb8Z9Vdm66wH68VX1/article/details/131798889
conseillé
Classement