时间序列丨基础概念理论 & 异常检测算法 & 相关学习资源 & 公开数据集
背景
时间序列 (time series,TS) 是一组按照时间发生先后顺序进行排列的数据点序列。通常一组时间序列的时间间隔为一恒定值(如 1s,1min,1h,1d),因此时间序列亦可作为离散时间数据进行分析处理。
时间序列异常检测(TS anomaly detection)的主要目标是从时间序列中识别异常的事件或行为,异常检测算法目前广泛应用于众多领域中,例如量化交易,网络入侵检测,智能运维等。
与之相关的研究领域:
时间序列预测(TS Forcasting):目前有众多基于预测思想的时间序列异常检测算法,主要可以产生序列的基带。
离群点检测 (Outlier detection) :算法模型同样适用于时间序列异常检测。
这篇文章主要是总结当前「单变量时间序列」异常检测基础概念 & 算法逻辑,单指标时间序列在工业界应用场景较多而且较为成熟。
至于复杂的「多变量时序异常检测」(Multivariate TS Anomaly Detection) 附上笔者了解的前沿模型。
时序类型
在实际场景中,不同的业务通常会对应不同类型的时间序列模式,一般可以划分为几种类型:趋势性、周期性、随机性、综合性。如下图所示
因此在实际场景中,难以使用单一模型来学习不同类型时间序列的特征模式,一般使用集成模型或者多个模型同时对时间序列进行异常判断。
异常类型
首先需要定义异常:在时间序列中,异常是指在一个或多个信号的模式发生意料之外的变化。
In time series signals, an anomaly is any unexpected change in a pattern in one or more of the signals.
主要可以分为以下三类异常 [1]:
「点异常」 Point Anomalies
即某些点与全局大多数点都不一样,如下图所示
「上下文异常」 Contextual Anomalies
即某个时间点的表现与前后时间段内存在较大的差异,如下图所示
「集合异常」 Collective Anomalies
即个体不存在异常,但是个体同时出现表现出异常状态,如下图所示
重要概念
平稳性
通常来说 平稳的时间序列指的是这个时间序列在一段时间内具有稳定的统计值,如均值,方差。许多时间序列的统计学模型都是依赖于时间序列是平稳的这一前提条件。
常用平稳性验证方法包括 Augmented Dickey Fuller Test (ADF Test),Kwiatkowski-Phillips-Schmidt-Shin Test (KPSS Test)。
对于非平稳的时间序列,可以通过差分、log 变换或平方根变换转化为平稳序列。
趋势[2]
当一个时间序列数据长期增长或者长期下降时,表示该序列有 趋势 。在某些场合,趋势代表着“转换方向”。
季节性[2:1]
当时间序列中的数据受到季节性因素(例如一年的时间或者一周的时间)的影响时,表示该序列具有 季节性 。季节性总是一个已知并且固定的频率。
周期性[2:2]
当时间序列数据存在不固定频率的上升和下降时,表示该序列有 周期性。周期波动通常至少持续两年。
周期性和季节性的区别:当数据的波动是无规律时,表示序列存在周期性;如果波动的频率不变并且与固定长度的时间段有关,表示序列存在季节性。一般而言,周期的长度较长,并且周期的波动幅度也更大。
自相关
指的是时间序列中某一个时刻的值和另一个时刻的值具有一定的相关性。
通常用于时间序列的周期性检测,可以参考另一篇文章:时间序列的周期性检测方法及其 Python 实践
白噪声
白噪声是一个对所有时间其自相关系数为零的随机过程。即任何两个时间的随机变量都不相关。[3]
虚假相关性
很多变量间的序列相关性非常强,但是实际上很可能是虚假相关性。
数据处理
缺失值处理
最常用的处理缺失值的方法包括填补(imputation)和删除(deletion)两种。
常见的数据填补方法:
Forward fill & backward fill
根据缺失值前/后的最近时间点数据填补当前缺失值。
Moving average
取缺失值发生之前的一段时间窗口内的值,计算其平均值或中位数来填补缺失。
Interpolation
插值方法要求缺失数据和邻近点之间满足某种拟合关系,因此插值法是一种先验方法且需要代入一些业务经验。
数据采样
通常来自不同数据源的时间轴常常无法一一对应,此时就要用到改变时间频率的方法进行数据处理。
由于无法改变实际测量数据的频率,我们能做的是改变数据收集的频率:
上采样(upsamping)
在某种程度上是凭空获得更高频率数据的方式,不增加额外的信息。
下采样(downsampling)
指减少数据收集的频率,也就是从原始数据中抽取子集的方式。
数据平滑
数据平滑通常是为了消除一些极端值或测量误差。即使有些极端值本身是真实的,但是并没有反应出潜在的数据模式仍需处理。
目前存在多种数据平滑方法:
Weighted averaging
即 moving average,既可以给定时间窗口内样本点相同权重,或邻近点指定更高权重。
Exponential smoothing
一次指数平滑,从最邻近到最早的数据点的权重呈现指数型下降的规律,针对没有趋势和季节性的序列。
Holt exponential smoothing
二次指数平滑,通过引入一个额外的系数来解决指数平滑无法应用于具有趋势性数据的问题,针对有趋势但没有季节性的序列。
Holt-Winters exponential smoothing
三次指数平滑,通过再次引入一个新系数的方式同时解决了 Holt exponential smoothing 无法解决具有季节性变化数据的不足。
所有的指数平滑法都要更新上一时间步长的计算结果,并使用当前时间步长的数据中包含的新信息。通过”混合“新信息和旧信息来实现,而相关的新旧信息的权重由一个可调整的参数来控制。
四种数据平滑对应的层次关系如下:
对于指数平滑系列的文章可以参考另一篇博客:时间序列丨Holt-Winters 指数平滑方法及其 Python 实践
异常检测算法
时序预测方法同样可以用于异常检测,以下会涉及且不加以严格区分。
基于统计
基于统计置信检验
3-sigma
值在 区间的概率为 99.74%,当数据分布超过这个区间时即认为是异常数据,为提升准确率可采用同环比策略。
t 检验,f 检验,卡方检验
ARIMA 系列模型
基于极值优化
基于度量
基于距离
- kNN
基于密度
基于聚类
K-means
难以确定聚类参数,聚类模型训练效率低。
DBSCAN
GMM
基于树
计算效率高,但不适用于高维特征数据;
基于谱
基于单分类
One-class SVM
不依赖于数据分布假设;
基于深度学习
CNN 系列
AutoEncoder 系列
- 基于变分自编码器重构概率的异常检测模型
- LSTM + AutoEncoder
- WWW 2018丨Donut:基于 VAE 的季节性 KPIs 无监督异常检测模型
Attention 系列
- Transformer [4]
- Informer
多变量时间序列
同名多元时间序列、多维时间序列,大部分情况下概念相同不再区分;
基于线性回归
- VAR / VARMA / VARMAX 【https://dreamhomes.top/posts/202109091543/】
AntoEncoder 系列
图神经网络系列
学习资源
相关课程
开源库
项目名称 | 描述 |
---|---|
Arrow | 用于创建、操作、格式化和转换日期、时间和时间戳的快捷方法 |
bta-lib | 用于回测算法和定量分析的 Pandas 技术分析库 |
cesium | 针对非均匀采样信号的具有特征提取的时间序列平台 |
Darts | 从 ARIMA 到深度学习的各种时间序列预测模型,包括集成、模型选择等 |
GENDIS | 遗传算法挖掘时间序列中的 Shapelet |
Featuretools | 时间序列特征提取工具,使用与 Pandas 兼容的类似关系数据库的数据容器 |
fecon235 | 金融经济序列计算工具。 |
ffn | 金融函数库 |
flint | Apache Spark 中的时间序列库 |
Flow Forecast | PyTorch 中构建的用于时间序列预测、分类和异常检测的深度学习框架 |
hctsa | 基于 Matlab 的特征提取库,可以从 Python 控制 |
HMMLearn | 隐马尔可夫模型与 scikit 学习兼容的 API |
khiva-python | 带有加速分析的时间序列库,提供了特征提取和 motif 挖掘等功能 |
matrixprofile-ts | Matrix Profile算法的 Python 实现,同时提供异常检测和模式(或“motif”)发现。 |
Nitime | 神经科学数据的时间序列分析 |
Pandas TA | 一个易于使用的 Python Pandas 扩展与130+技术分析指标 |
Pastas | 水文数据的时间序列分析 |
prophet | 时间序列预测具有多重季节性的线性或非线性增长的时间序列数据 |
pyDSE | 针对动态系统估计模型的 ARMA 模型 |
pyFTS | 基于模糊集规则的时间序列预测模型,包括多步、点、区间和概率预测 |
PyFlux | 经典时间序列预测模型 |
pysf | 一个scikit-learn兼容的机器学习库监督预测 |
pytorch-forecasting | 基于 PyTorch 各种前沿时间序列预测神经网络模型 |
pyts | 包含时间序列预处理、变换以及分类技术 |
ruptures | 提供查找时间序列中变化点的方法,如信号的均值或尺度的移位 |
seglearn | 将 scikit-learn 管道概念扩展到序列数据 |
sktime | scikit-learn兼容库学习与时间序列数据,包括时间序列分类/回归和(监督)预测 |
statsmodels | 包含一个用于经典时间序列模型和假设检验的子模块 |
stumpy | 计算时间序列子序列全对相似搜索的矩阵轮廓 |
TensorFlow-Time-Series-Examples | 基于 tf.contrib.timeseries 模块的时间序列模型 |
tensorflow_probability.sts | Tensorflow Probability 的贝叶斯相关方法 |
timemachines | 提供 prophet 和其它库的功能接口 |
Traces | 一个非均匀间隔时间序列分析的库 |
ta-lib 丨 ta | 计算金融时间序列的技术指标 |
TIMEX | 全自动的时间序列数据摄取,预处理,预测和结果可视化管道。 |
tsfresh | 从时间序列中提取和过滤特征,允许监督分类器和回归器应用于时间序列数据 |
tslearn | 直接时间序列分类器和回归器 |
tspreprocess | 预处理时间序列(重采样、去噪等) |
tsmoothie | 一个用于以向量化方式平滑时间序列和离群点检测的 python 库 |
数据集
项目 | 描述 |
---|---|
awesome-public-datasets | 庞大的公开数据库,包括时间序列 |
ecmwf_models | 气候分析数据的阅读器和转换器 |
M4 competition | 100000 时间序列预测比赛数据 |
pandas-datareader | 从不同来源获取金融数据 (e.g. yahoo, google, Quandl) |
Timeseriesclassification.com | 时间序列分类数据集 |
multivariate-time-series-data | 多元时间序列预测数据集 |
Chandola, Varun, Arindam Banerjee, and Vipin Kumar. “Anomaly detection: A survey.” ACM computing surveys (CSUR) 41.3 (2009): 1-58. ↩︎
https://towardsdatascience.com/the-time-series-transformer-2a521a0efad3 ↩︎