共计 5727 个字符,预计需要花费 15 分钟才能阅读完成。
在本文中将摸索各种办法来揭示工夫序列数据中的异样模式和异样值。
工夫序列数据是按肯定工夫距离记录的一系列观测后果。它常常在金融、天气预报、股票市场剖析等各个领域遇到。剖析工夫序列数据能够提供有价值的见解,并有助于做出理智的决策。
异样检测是辨认数据中不合乎预期行为的模式的过程。在工夫序列数据的上下文中,异样能够示意偏离失常模式的重大事件或异样值。检测时间序列数据中的异样对于各种利用至关重要,包含欺诈检测、网络监控和预测性保护。
首先导入库,为了不便数据获取,咱们间接应用 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')
了解工夫序列数据
在深入研究异样检测技术之前,先简略介绍工夫序列数据的特色。工夫序列数据通常具备以下属性:
- 趋势: 数据值随工夫的长期减少或缩小。
- 季节性: 以固定距离反复的模式或循环。
- 自相干: 以后观测值与先前观测值之间的相关性。
- 噪声: 数据中的随机稳定或不规则。
让咱们可视化下载的工夫序列数据
# 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()
从图中能够察看到股票价格随工夫增长的趋势。也有周期性稳定,表明季节性的存在。间断收盘价之间仿佛存在一些自相关性。
工夫序列数据预处理
在利用异样检测技术之前,对工夫序列数据进行预处理是至关重要的。预处理包含解决缺失值、平滑数据和去除异样值。
缺失值
因为各种起因,如数据收集谬误或数据中的空白,工夫序列数据中可能呈现缺失值。适当地解决缺失值以防止剖析中的偏差是必要的。
# Check for missing values
missing_values = data.isnull().sum()
print(missing_values)
咱们应用的股票数据数据不蕴含任何缺失值。如果存在缺失值,能够通过输出缺失值或删除相应的工夫点来解决它们。
平滑数据
对工夫序列数据进行平滑解决有助于缩小噪声并突出显示潜在的模式。平滑工夫序列数据的一种罕用技术是挪动平均线。
# 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()
该图显示了原始收盘价和应用挪动平均线取得的平滑版本。平滑有助于整体趋势的可视化和缩小短期稳定的影响。
去除离群值
异样异样值会显著影响异样检测算法的性能。在利用异样检测技术之前,辨认和去除异样值是至关重要的。
# 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()
上图显示了去除辨认的异样值后的工夫序列数据。通过缩小极值的影响,去除异样值有助于进步异样检测算法的准确性。
有人会说了,咱们不就是要检测异样值吗,为什么要将它删除呢?这是因为,咱们这里删除的异样值是非常明显的值,也就是说这个预处理是初筛,或者叫粗筛。把非常明显的值删除,这样模型能够更好的判断哪些难判断的值。
统计办法
统计办法为工夫序列数据的异样检测提供了根底。咱们将探讨两种罕用的统计技术:z-score 和挪动均匀。
z-score
z-score 掂量的是察看值离均值的规范差数。通过计算每个数据点的 z 分数,咱们能够辨认显著偏离预期行为的观测值。
# 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()
该图显示了每个数据点的计算 z -score。z-score 高于阈值 (红色虚线) 的观测值可视为异样。
挪动平均线
另一种异样检测的统计办法是基于挪动平均线。通过计算挪动平均线并将其与原始数据进行比拟,咱们能够辨认与预期行为的偏差。
# 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()
该图显示了每个数据点与挪动平均线的偏差。正偏差示意值高于预期行为,而负偏差示意值低于预期行为。
机器学习办法
机器学习办法为工夫序列数据的异样检测提供了更先进的技术。咱们将探讨两种风行的机器学习算法: 孤立森林和 LSTM Autoencoder。
孤立森林
孤立森林是一种无监督机器学习算法,通过将数据随机划分为子集来隔离异样。它测量隔离观察所需的均匀分区数,而异常情况预计须要更少的分区。
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()
该图显示了由孤立森林算法辨认的异样工夫序列数据。异样用不同的色彩突出显示,表明它们偏离预期行为。
LSTM Autoencoder
LSTM (Long – Short-Term Memory)自编码器是一种深度学习模型,可能学习工夫序列数据中的模式并重构输出序列。通过将重建误差与预约义的阈值进行比拟,能够检测异样。
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()
该图显示了每个数据点的重建误差。重建误差高于阈值 (红色虚线) 的观测值可视为异样。
异样检测模型的评估
为了精确地评估异样检测模型的性能,须要有蕴含无关异样存在或不存在的信息的标记数据。然而在事实场景中,获取带有已知异样的标记数据简直不可能,所以能够采纳代替技术来评估这些模型的有效性。
最罕用的一种技术是穿插验证,它波及将可用的标记数据分成多个子集或折叠。模型在数据的一部分上进行训练,而后在残余的局部上进行评估。这个过程反复几次,并对评估后果进行均匀,以取得对模型性能更牢靠的预计。
当标记数据不容易取得时,也能够应用无监督评估度量。这些指标基于数据自身固有的特色 (如聚类或密度估计) 来评估异样检测模型的性能。无监督评估指标的例子包含轮廓系数 silhouette score、邓恩指数 Dunn index 或均匀最近邻间隔。
总结
本文摸索了应用机器学习进行工夫序列异样检测的各种技术。首先对其进行预处理,以解决缺失值,平滑数据并去除异样值。而后探讨了异样检测的统计办法,如 z -score 和挪动均匀。最初探讨了包含孤立森林和 LSTM 自编码器在内的机器学习办法。
异样检测是一项具备挑战性的工作,须要对工夫序列数据有深刻的理解,并应用适当的技术来发现异常模式和异样值。记住要尝试不同的算法,微调参数并评估模型的性能,以获得最佳后果。
https://avoid.overfit.cn/post/a13dadc1382e4579aff287ee9ddef854
作者:AI Quant