时间序列异常检测:统计和机器学习方法介绍

news2024/11/25 0:34:39

在本文中将探索各种方法来揭示时间序列数据中的异常模式和异常值。

时间序列数据是按一定时间间隔记录的一系列观测结果。它经常在金融、天气预报、股票市场分析等各个领域遇到。分析时间序列数据可以提供有价值的见解,并有助于做出明智的决策。

异常检测是识别数据中不符合预期行为的模式的过程。在时间序列数据的上下文中,异常可以表示偏离正常模式的重大事件或异常值。检测时间序列数据中的异常对于各种应用至关重要,包括欺诈检测、网络监控和预测性维护。

首先导入库,为了方便数据获取,我们直接使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/652140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

增加内容曝光、获得更多粉丝 - 「评论发红包」功能

目录 博客发放以及领取红包规则 1. 发布博客评论社区红包规则: 2. 博客评论红包领取规则 如何发红包评论? 发布红包评论益处 不知道大家有没有注意到,我们的「评论发红包」功能已经上线啦~ 现在几乎所有的内容 -- 博客&…

管理类联考——英语——技巧篇——完型填空——经典方法论

放弃完型填空,意味着你的阅读部分得分至少能稳定在34分以上(满分40分,要得34分以上意味着至多只能错3道题),且其他题型也发挥不错,才能确保总分是一个不错的分数。然而,翻译和写作考查的都是硬实力,新题型自…

解释器模式(二十三)

相信自己,请一定要相信自己 上一章简单介绍了 备忘录模式(二十二), 如果没有看过, 请观看上一章 一. 解释器模式 引用 菜鸟教程里面 解释器模式介绍: https://www.runoob.com/design-pattern/interpreter-pattern.html 解释器模式(Interpreter Patter…

科研热点|影响因子发布时间确定,AHCIESCI将首获IF~

根据科睿唯安(Clarivate)官方公众号消息,2023年度《期刊引证报告》(Journal Citation Reports,简称JCR)即将于今年6月底正式发布! 本年度JCR将对Web of Science核心合集收录的所有期刊赋予期刊…

C语言指针讲解(适用于初学者)

本文参考视频: https://b23.tv/xLOG6SV,相当于学习笔记,这样概念混淆的时候也可以看看。 一.一级指针 以下图表示的意思是: a的地址为0XA0,定义一个指针p,指向a的地址,计算机也会给p一个内存空间&p:0XB0 图中&a…

【机器学习】十大算法之一 “KNN”

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

疑似有用户安装Win11六月更新之后,无法打开Chrome浏览器

近日有网友表示,在安装6月更新的KB5027231之后,无法打开Chrome浏览器了,并且在任务管理器中可以看到相关**ERP系统**进程,但是 Chrome浏览器无法显示。 据了解,微软在本月的补丁星期二活动中,面向Win11发布…

MySQL:多表查询(全面详解)

MySQL:多表查询 前言附录:常用的 SQL 标准有哪些一、一个案例引发的多表连接1、案例说明2、笛卡尔积(或交叉连接)的理解3、案例分析与问题解决 二、多表查询分类讲解1、等值连接 vs 非等值连接1.1 等值连接1.2 非等值连接 2、自连…

chatgpt赋能python:使用Python生成应用的SEO

使用Python生成应用的SEO 在当今数字化时代中,拥有一个优化良好的应用程序对于任何企业都是至关重要的。 SEO(搜索引擎优化)是一个崭新且不断发展的领域,它对于企业非常具有建设性。在本文中,我们将学习如何使用Pytho…

CADisplayLink前世今生

本文字数:19803字 预计阅读时间:50分钟 用最通俗的语言,描述最难懂的技术 前情描述 上周同事做code review的时候说到了CADisplayLink的一些变化,感触颇深,提到了接口的一些变动,现在就自己的一些理解加上网…

全志V3S嵌入式驱动开发(spi-nand驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 nand flash相信大家并不陌生,现在很多的固态硬盘上面,其实有很多的nand flash。只不过根据存储单元,分成slc、m…

人机融合与因果关系

苏格兰哲学家大卫.休谟认为因果关系很难被认识,主要是因为他认为我们的认识是通过经验得来的,而经验只能告诉我们事件的先后顺序,而不能告诉我们事件之间的必然联系。他提出了“常见的联想”(常见的经验)和“原则的联想…

使用 MATLAB 进行气象激光雷达图像分析(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

状态模式(二十四)

相信自己,请一定要相信自己 上一章简单介绍了 解释器模式(二十三), 如果没有看过, 请观看上一章 一. 状态模式 引用 菜鸟教程里面 状态模式介绍: https://www.runoob.com/design-pattern/state-pattern.html 在状态模式(State Pattern)中&…

go常用特性(embed、插件化开发)、常用包(并发)

go常用特性及常用包 1 常用特性 1.1 go:build //go:build !windows //go:build是前缀指令,!windows是逻辑判断的条件。这个指令的作用是在Windows系统外,编译当前源文件。// build !windows // build是前缀指令,!windows是编译标记。这个指…

CSDN如何获得铁粉?

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

springboot+vue的校园疫情防控系统(附数据库,源码)

💕💕作者:程序员徐师兄 个人简介:7 年大厂程序员经历,擅长Java、微信小程序、Python、Android等,大家有这一块的问题可以一起交流! 各类成品java毕设 。javaweb,ssh,ssm&…

责任链模式(二十六)

相信自己,请一定要相信自己 上一章简单介绍了策略模式(二十五), 如果没有看过, 请观看上一章 一. 责任链模式 引用 菜鸟教程里面的责任链模式介绍: https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html 顾名思义,责任链模式…

Science Advance||个体动态脑中鲁棒的大脑状态

文章目录 个体化动态方法(INSCAPE 方法):(A)生成脑共同激活状态的组模板:(B)个体水平分析: 不同的大脑状态有特定的协同激活模式(coactivation patterns&…

ai写作怎么搞?我来教你几招

在当今信息化时代,ai技术的发展已经进入到了一个全新的阶段,越来越多的人们开始运用ai技术进行写作。作为一种创新性的工具,ai写作已经成为了许多企业和个人写作必不可少的工具之一。但是,对于初学者来说,如何快速上手…