如何处理时间序列异常值?理解、检测和替换时间序列中的异常值

news/2024/9/18 21:13:25/ 标签: 数据库, 人工智能, 算法

异常值的类型 (欢迎来到雲闪世界)

异常值是与正常行为有显著偏差的观察结果。

时间序列可能会因某些异常和非重复事件而出现异常值。这些异常值会影响时间序列分析,并误导从业者得出错误的结论或有缺陷的预测。因此,识别和处理异常值是确保时间序列建模可靠性的关键步骤。

在时间序列中,异常值通常分为两种类型:加性异常值和创新异常值。

附加异常值

附加异常值是相对于历史数据表现出异常高(或低)值的观察值。

加性异常值的一个例子是由于促销或相关病毒式内容导致产品销量激增。有时这些异常值是由于错误的数据收集而发生的。加性与异常值对底层系统的非持久性影响有关。异常值仅限于相应的观察值,此后时间序列恢复其正常模式。

包含一些附加异常值的时间序列。图片由作者提供。

附加异常值可以跨越连续的观测值。这些异常值也称为子序列异常值或异常值块。

创新异类

创新异常值与附加异常值类似,但具有持久性效应。异常值会对后续观察产生影响。一个常见的例子是,由于某些病毒式内容,网站的访问量有所增加。该网站的访问量可能会继续高于平常,直到这种影响消失。

编辑搜图

请点击输入图片描述(最多18字)

具有创新异常值的时间序列。图片由作者提供。

处理创新异常值的一种方法是使用干预分析。例如,使用一个虚拟变量,其效果会随着时间的推移而逐渐减弱。

与变化点的关系

离群值与变化的概念相关。一些观测值被称为变化点,标志着时间序列中结构变化的开始。

这些变化点与异常值相关但又不同。异常值是相对于特定分布的异常观测值。变化点是以分布变化为特征的结构性突变。

异常值的含义

如何处理异常值取决于其性质和分析的目标。

因噪声(例如数据收集错误)而产生的异常值是不需要的数据。在分析之前,应删除或替换此类异常值。

另一方面,一些异常值本身很有趣,而且预测起来很重要。因此,删除它们可能会导致误导性结论或过于乐观的预测。这种情况发生在各种领域,例如欺诈检测或能源。考虑一个能源需求的时间序列,其中能源负荷在某个时期激增。这种类型的异常值可能是由某些异常事件(例如极寒天气)引起的。公用事业公司需要预测此类异常值,因此删除它们并不是一个好主意。对这些观察结果进行建模是平衡能源供需和防止停电的关键。

检测并处理异常值

检测时间序列数据中的异常值的方法有很多种,其中很多方法可以分为两类:基于预测或基于估计。

基于预测的检测

根据预测检测异常值需要使用预测模型。目标是将预测值与实际值进行比较。两者之间的较大差异表明观察结果为异常值。

让我们使用以下时间序列来看一下这在实践中是如何运作的:

从datasetsforecast.m4导入M4数据集,*_ = M4.load( './data' , 'Hourly' ) series = dataset.query( f'unique_id=="H1"' ).reset_index(drop= True )

上面代码中,我们从 M4 数据集中获取了 id 为 H1 的时间序列。接下来,我们基于 statsforecast 构建一个季节性朴素预测模型:

从statsforecast导入StatsForecast
从statsforecast.models导入SeasonalNaive # 季节性朴素模型
model = [SeasonalNaive(season_length= 24 )] # 创建 statsforecast 实例
sf = StatsForecast(df=series, models=model, freq= 'H' ) 
# 拟合预测模型
sf.forecast(h= 1 , level=[ 99 ], fitted= True ) # 获取样本内预测
preds = sf.forecast_fitted_values()

建立模型后,我们使用forecast_fitted_values方法获取训练样本的预测区间。然后,我们将其与实际值进行比较:

# 基于预测区间的异常值
outliers = preds.loc[(preds[ 'y' ] >= preds[ 'SeasonalNaive-hi-99' ]) | (preds[ 'y' ] <= preds[ 'SeasonalNaive-lo-99' ])]

任何超出 99% 预测区间的观测值均被视为异常值。

这是异常值的图:

季节性朴素模型检测到的异常值。图片来自作者

您也可以使用预测的实际误差来代替间隔。在这种情况下,当误差异常大时,就会出现异常值。

基于估计的检测

基于估计的方法使用汇总统计数据来检测异常值。一个例子是 z 分数。其思想是通过减去平均值并除以标准差来标准化数据。然后,异常值是具有较大 z 分数值的点。

以下是一个例子:

# 高于/低于 3 个标准差的值
thresh = 3rolling_series = series[ 'y' ].rolling(window= 24 , min_periods= 1 , center= True ) 
avg = rolling_series.mean() 
std = rolling_series.std(ddof= 0 ) 
zscore = series[ 'y' ].sub(avg).div(std) 
m = zscore.between(-thresh, thresh)

请注意,使用滚动窗口计算平均值和标准差来解释时间序列中的时间依赖性。

另一种方法是使用时间序列分解方法并检测残差上的异常值。让我们首先使用 STL 获取残差:

从statsmodels.tsa.seasonal导入STL stl = STL(series[ 'y' ].values, period= 24 , robust= True ).fit() 
resid = pd.Series(stl.resid)

请注意,我们将参数robust=True传递给 STL,以便模型可以容忍更大的错误。

然后,您可以使用标准箱线图规则来检测异常值。例如,将低于第一四分位数或高于第三四分位数的 IQR 3 倍的观测值标记为异常。操作方法如下:

q1,q3 = resid.quantile([ .25,.75 ])
iqr = q3 - q1 is_outlier_r = ~resid.apply(lambda x:q1 - (3 * iqr)<x < q3 + (3 * iqr))
is_outlier_r_idx = np.where(is_outlier_r)[ 0 ] resid_df = resid.reset_index()
resid_df [ 'index' ] = pd.date_range(end = '2021-12-01',periods = series.shape [ 0 ],freq = 'H')
resid_df.columns = [ 'index','残差' ]

这些异常值在一系列残差中也很明显:

使用残差中的箱线图规则检测异常值。图片由作者提供。

替换异常值

检测后,您可以通过用更合理的值替换异常值来清除异常值。

首先删除异常值,然后将问题转变为数据插补任务。

时间序列插补有很多方法。这些包括:

  • 向前或向后填充

  • 移动平均线

  • 线性插值

关键要点

  • 时间序列异常值是与历史数据有显著偏差的观测值

  • 异常值在持久性和含义方面可以表现出不同的特征

  • 异常值检测有多种方法,包括基于预测的方法和基于估计的方法

  • 您可以使用数据插补技术替换不需要的异常值

感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)


http://www.ppmy.cn/news/1518616.html

相关文章

【TDesign】如何修改CSS变量

Tdesign的组件想通过style定义样式没效果, 可以通过组件api文档修改, 组件提供了下列 CSS 变量&#xff0c;可用于自定义样式。 比如Cell, https://tdesign.tencent.com/miniprogram/components/cell?tabapi 提供了&#xff1a; –td-cell-left-icon-color 图标颜色 –td-cell…

【Leetcode 2341 】 数组能形成多少数对 —— 去重

给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数从 nums 中移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返回一个下标从 0 开始、长度为 2 的…

电脑变声器软件哪个好用?最新款实时变声器数据公开!

电脑变声器软件哪个好用&#xff1f;什么场合下需要用到变声器&#xff1f;在派对或朋友聚会中&#xff0c;使用变声器可以模仿各种动物、名人或虚构角色的声音&#xff1b;直播变声搞怪&#xff1b;匿名游戏聊天&#xff1b;电影、动画、电视音效、旁白制作等等&#xff0c;都…

高职院校大数据分析与可视化微服务架构实训室解决方案

一、前言 随着信息技术的飞速发展&#xff0c;大数据已成为推动社会进步与产业升级的关键力量。为了培养适应未来市场需求的高素质技术技能型人才&#xff0c;高职院校纷纷加大对大数据分析与可视化技术的教学投入。唯众&#xff0c;作为国内领先的职业教育解决方案提供商&…

2 Python开发工具:PyCharm的安装和使用

本文是 Python 系列教程第 2 篇&#xff0c;完整系列请查看 Python 专栏。 1 安装 官网下载地址https://www.jetbrains.com.cn/pycharm/&#xff0c;文件比较大&#xff08;约861MB&#xff09;请耐心等待 双击exe安装 安装成功后会有一个30天的试用期。。。本来想放鸡火教程&…

Nginx负载均衡请求队列配置:优化流量管理

在高流量的Web应用场景中&#xff0c;合理地管理进入的请求流量对于保持服务的稳定性和响应性至关重要。Nginx提供了请求队列的配置选项&#xff0c;允许开发者控制进入后端服务器的请求数量。通过配置请求队列&#xff0c;可以在后端服务器达到最大处理能力时&#xff0c;优雅…

005、架构_数据节点

​DN组件总览 ​ DN节点包含进程 dbagent进程:主要提供数据节点高可用、数据导入导出、数据备份恢复、事务一致性、运维类功能、集群的扩缩容、卸数等功能;MySQL进程:主要提供数据一致性、分组管理、快同步复制、高低水位等;

测试岗位应该学什么

以下是测试岗位需要学习的一些关键内容&#xff1a; 1. 测试理论和方法 - 了解不同类型的测试&#xff0c;如功能测试、性能测试、压力测试、安全测试、兼容性测试等。 - 掌握测试策略和测试计划的制定。 2. 编程语言 - 至少熟悉一种编程语言&#xff0c;如 Python、Java…

网络路由介绍,route指令,查询路由表的过程,默认路由

目录 路由 本地主机的路由功能 引入 route指令 查询路由表的过程 介绍 示例 默认路由 注意 路由 本地主机的路由功能 引入 报文经过多个路由器转发至公网,再从公网定位后转发至私网,最终到达目标主机 而报文肯定是要先经过本地主机的 所以本地主机也具有路由功能,也…

django网吧收费管理系统 项目源码26819

摘 要 随着互联网的普及&#xff0c;网吧作为公共互联网接入场所&#xff0c;依旧在许多地区发挥着重要作用。现代网吧不仅仅是提供上网服务的场所&#xff0c;还包括了游戏、社交、休闲等多功能体验。为了提高网吧的服务质量和运营效率&#xff0c;迫切需要一个高效的管理系统…

mysql基础语法——个人笔记

0 前言 以前学习且实践过mysql&#xff0c;但后来用得少&#xff0c;随着岁月更替&#xff0c;对其印象渐浅&#xff0c;所以每次需要用时&#xff0c;都会去再看一眼语法规范&#xff0c;然后才能放心动手操作 然而&#xff0c;在信息爆炸的时代&#xff0c;查语法规范时&am…

ubuntu录屏解决ubuntu下无法播放MP4格式文件的方法

参考 gnome gnome是系统自带的录屏&#xff0c;通过ctrlshiftaltr触发 保存到了视频目录下&#xff0c;webm格式文件。 screencastify 这是一个chrome扩展&#xff0c;&#xff0c;一般不推荐使用 recapp 比gnome自由一些&#xff0c;可以自由屏幕录制。但是无法修改录制…

如何将Dxf文件中的Vertex与相应的polyline关联起来

在处理DXF&#xff08;Drawing Exchange Format&#xff09;文件时&#xff0c;将VERTEX和相应的POLYLINE关联起来是一个常见的需求。这通常涉及解析DXF文件中的几何实体&#xff0c;并确保它们之间的关系正确。以下是一些步骤和示例代码&#xff0c;帮助你实现这种关联&#x…

如果学流式系统你想选一本书,那必须是这本

“如果你关心流式处理和批处理工作的正确性&#xff0c;那么这本书是必读的。它对该主题的讨论是我看到的思考最清晰、最合逻辑的&#xff0c;其思想也被精彩诠释。” ——马丁克莱普曼&#xff08;Martin Kleppmann&#xff09;&#xff0c;剑桥大学 流式系统 如今&#xff0c…

关于mysql的information_schema库表对象

MySQL的information_schema库是一个非常重要的系统数据库&#xff0c;它存储着关于MySQL服务器中所有其他数据库的元数据&#xff08;meta-data&#xff09;。元数据是指关于数据的数据&#xff0c;比如数据库名、表名、列名、数据类型、权限信息等&#xff0c;并不包含实际业务…

Django 后端架构开发:高效测试自动化工具

Django 后端架构开发&#xff1a;高效测试自动化工具 目录 &#x1f6e0; nose&#xff1a;强大的测试框架 &#x1f3ad; faker&#xff1a;模拟数据生成器 &#x1f5a5; PyAutoGUI&#xff1a;跨平台 GUI 自动化测试 &#x1f9ea; coverage&#xff1a;代码覆盖率测量 …

【C++】容器vector常用接口详解

目录 一.vector基本介绍 二.vector的构造&#xff08;constructor&#xff09; 三.vector迭代器&#xff08;iterator&#xff09; 四.vector的三种遍历 1.for循环 2.范围for 3.迭代器&#xff08;正向、反向&#xff09; 五. vector扩容操作 1.reserve 2.resize 六.…

若依微服务集成knife4j实现swagger增强

Knife4j 是一个基于 Swagger 的API文档生成工具,专注于为 Java 开发者提供更好的接口文档管理和展示功能。它提供了一种简单、直观的方式来展示和管理 API 文档,使开发者能够更方便地查看和理解接口的定义、参数、返回结果等信息。 1、增加knife4j全局版本号和依赖包 在根目录…

Kafka入门:从零开始了解分布式流处理平台

什么是Kafka Apache Kafka是由LinkedIn公司开发&#xff0c;后来由Apache软件基金会维护的一个分布式、分区、多副本的基于ZooKeeper协调的分布式消息系统。Kafka不仅是一个消息队列&#xff0c;还是一个强大的流处理平台&#xff0c;它能够实时地处理大量数据&#xff0c;满足…

Kimi浏览器助手,一键加速浏览器搜索工作效率!

在这个信息数字化时代&#xff0c;我们每个人都像是一名信息的探险家&#xff0c;每天在网络的海洋中寻找着知识与答案。而Kimi浏览器插件助手&#xff0c;就像是我们手中的罗盘&#xff0c;指引我们以更快的速度抵达搜索获取结果。它在实际使用中是如何帮助我们提升效率的。 一…