时间序列分析中异常值检测的有效统计方法和工具
异常值:这些令人困扰的数据点可能会扭曲统计模型、扭曲预测并破坏决策过程。
雲闪世界专门介绍时间序列数据中异常值的识别和管理的四部分系列文章的开篇,我们将探索视觉和统计方法来有效识别时间序列数据中的异常值。对于任何想要提高分析准确性的人来说,这些基础知识都至关重要。
在第二篇文章中,我专门介绍了机器学习方法,鉴于其重要性和复杂性,它们值得专门讨论:查找时间序列数据中异常值的终极指南(第2部分)用于学习时间序列中异常检测的有效机器学习方法和工具
第三篇文章探讨了如何 管理 这些异常值的各种策略,包括移除、保留和封顶技术,提供了一些处理异常值的实用方法。
在第四篇也是最后一篇文章中,我将继续探讨管理异常值的方法,重点关注归因和转换方法,以及评估异常值处理的影响。
您应该关心时间序列数据中的异常值的一些原因:
- 异常值会严重扭曲和误传数据集的关键统计数据,例如平均值、方差和相关系数。
- 异常值会影响预测模型的性能。
- 异常值可以掩盖时间序列数据中的真实趋势和周期行为。
- 根据没有经过严格审查的异常数据做出的决策可能会导致糟糕的战略决策。
还有许多其他原因可以说明为什么处理时间序列数据中的异常值对于有效分析至关重要,但这些理由足以激励我们开始探索。
离群值与异常
我将交替使用“异常”和“离群值”这两个术语,但它们的定义有细微的差别。异常可以指任何偏离常态的数据点,而离群值则具体表示远离大多数数据点的极值。许多方法都可以应用于异常和离群值。
如何为时间序列数据选择正确的异常值检测方法?
选择时间序列数据的最佳异常检测方法首先要深入了解数据集和预期异常。
话虽如此,首先要考虑数据集的大小和可用的计算资源。
对于可解释性至关重要的数据集,Z 分数和移动平均值等简单方法可能是理想的选择。但是,更复杂的场景(例如需要检测细微模式的场景)可能会受益于 LSTM 网络等高级技术(将在本系列的第二部分中介绍),这些技术需要大量数据和计算能力。
请记住:数据集大小、计算资源、可解释性和任务性质是选择适当的异常值检测方法的关键。
尝试各种方法和指标以准确评估其性能可能会大有裨益。如果可能,请考虑使用多种方法来提高准确性。此外,使用您或领域专家对该领域的了解可以指导您选择方法。
没有一刀切的解决方案;最好的方法取决于您的数据的具体特征、您想要检测的异常的性质以及您的特定要求。
评估异常检测方法在欺诈检测等领域尤其具有挑战性,因为异常并不常见但很重要。
准确率、召回率和 F1 分数等指标对于评估这些方法在捕获欺诈活动和减少误报方面的有效性至关重要。
在预测性维护等领域,ROC 曲线和 AUC 指标对于及时识别潜在的机器故障非常有价值。
在医疗保健等行业中,可视化经常用于监测患者的生命体征,但此类方法的准确性在很大程度上取决于领域专业知识的正确解释。
单变量与多变量数据
在开始异常值分析之前,重要的是考虑您的数据是单变量还是多变量。
单变量时间序列数据由随时间记录的单个观察序列组成。典型示例包括每日股票价格、每月销售数据或年度天气数据。
相比之下,多元时间序列数据涉及在相同时间间隔观察和记录的多个变量或序列。
这种类型的数据捕捉不同变量之间的关系和相互作用以及它们各自的趋势和季节性变化。例如,多变量时间序列可以包括温度、湿度和风速的每日测量值,所有这些都是同时记录的。
本文描述的某些方法更适合单变量数据,而其他方法则专门用于处理多变量。
但是,有些方法可以同时适用于这两种数据。在深入研究这些方法之前,我将在此概述针对这两种数据的几种常用方法:
对于单变量数据,通常使用时间序列图和箱线图等视觉检查方法,每次只关注一个变量。STL 分解也传统上用于单变量设置。Z 分数、改进的 Z 分数方法和 Grubbs 检验也用于此类数据。
孤立森林、LOF 和自动编码器等机器学习方法通常用于多变量数据的降维和异常检测,但它们也可以压缩和重建单变量时间序列数据,以根据重建误差识别异常。
异常值很多,远不止上述思维导图列出的这些对于多变量数据,散点图分析是考察多变量关系的常用方法,而孤立森林、LOF、自编码器等自然适合处理高维数据。
请注意,一些 单变量方法也可以应用于多变量数据。例如,Z 分数方法也可以用于多变量场景,通过独立计算每个变量的 Z 分数。
箱线图可分别用于多变量数据集中的每个变量,以识别每个维度中的异常值。在多变量场景中,散点图可用于绘制变量对。STL分解虽然传统上是单变量的,但可以通过独立分解每个序列来分析多变量序列。
检测数据中的异常值的最佳方法是什么?
视觉方法
目视检查是识别时间序列数据中异常值的基本方法。数据的性质也会影响目视检查的实施方式。
时间序列图
这是时间序列数据最直接的图表。它允许您查看趋势、模式、季节性变化和随时间变化的潜在异常值。与其他数据有显著偏差的点通常很容易被发现。
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
def plot_temporal_trends(df, columns):
num_plots = len(columns)
fig, axes = plt.subplots(num_plots, 1, figsize=(10, num_plots * 3), sharex=False) # sharex=False to not share x-axis
fig.suptitle(f'Temporal Trends', fontsize=16, y=1.02 + 0.01 * num_plots)
if num_plots == 1: # Ensure axes is iterable
axes = [axes]
for ax, col in zip(axes, columns):
ax.plot(df.index, df[col], marker='o', markersize=4, linestyle='-', label=col)
ax.set_title(f'{col} - {title}')
ax.set_ylabel('Value')
# Setting the date formatter for each subplot's x-axis
ax.xaxis.set_major_locator(mdates.YearLocator(base=2))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))
# Rotate and align the tick labels so they look better
ax.tick_params(axis='x', rotation=45)
ax.legend()
plt.tight_layout(rect=[0, 0, 1, 0.97]) # Adjust layout to make room for the title
plt.show()
columns = df.columns.tolist()
plot_temporal_trends(df, columns)
您能发现异常值吗?
标签:指南,plt,df,数据,outliers,counts,终极,异常,查找时间 From: https://blog.csdn.net/2401_85233349/article/details/140490164