来源:算法进阶 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()
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()
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()
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()
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()
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()
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()
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