背景

时间序列 (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]

  • 虚假相关性

    很多变量间的序列相关性非常强,但是实际上很可能是虚假相关性。

    虚假相关性案例:http://tylervigen.com/spurious-correlations

数据处理

缺失值处理

最常用的处理缺失值的方法包括填补(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

    值在(μ3σ,μ+3σ)(\mu-3\sigma, \mu+3\sigma) 区间的概率为 99.74%,当数据分布超过这个区间时即认为是异常数据,为提升准确率可采用同环比策略。

    3-sigma 原则
  • t 检验,f 检验,卡方检验

ARIMA 系列模型

基于极值优化

基于度量

基于距离

  • kNN

基于密度

基于聚类

  • K-means

    难以确定聚类参数,聚类模型训练效率低。

  • DBSCAN

  • GMM

基于树

基于谱

基于单分类

基于深度学习

CNN 系列

AutoEncoder 系列

Attention 系列

  • Transformer [4]
  • Informer

多变量时间序列

同名多元时间序列多维时间序列,大部分情况下概念相同不再区分;

基于线性回归

AntoEncoder 系列

图神经网络系列

学习资源

相关课程

开源库

项目名称描述
Arrow用于创建、操作、格式化和转换日期、时间和时间戳的快捷方法
bta-lib用于回测算法和定量分析的 Pandas 技术分析库
cesium针对非均匀采样信号的具有特征提取的时间序列平台
Darts从 ARIMA 到深度学习的各种时间序列预测模型,包括集成、模型选择等
GENDIS遗传算法挖掘时间序列中的 Shapelet
Featuretools时间序列特征提取工具,使用与 Pandas 兼容的类似关系数据库的数据容器
fecon235金融经济序列计算工具。
ffn金融函数库
flintApache Spark 中的时间序列库
Flow ForecastPyTorch 中构建的用于时间序列预测、分类和异常检测的深度学习框架
hctsa基于 Matlab 的特征提取库,可以从 Python 控制
HMMLearn隐马尔可夫模型与 scikit 学习兼容的 API
khiva-python带有加速分析的时间序列库,提供了特征提取和 motif 挖掘等功能
matrixprofile-tsMatrix 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 管道概念扩展到序列数据
sktimescikit-learn兼容库学习与时间序列数据,包括时间序列分类/回归和(监督)预测
statsmodels包含一个用于经典时间序列模型和假设检验的子模块
stumpy计算时间序列子序列全对相似搜索的矩阵轮廓
TensorFlow-Time-Series-Examples基于 tf.contrib.timeseries 模块的时间序列模型
tensorflow_probability.stsTensorflow Probability 的贝叶斯相关方法
timemachines提供 prophet 和其它库的功能接口
Traces一个非均匀间隔时间序列分析的库
ta-libta计算金融时间序列的技术指标
TIMEX全自动的时间序列数据摄取,预处理,预测和结果可视化管道。
tsfresh从时间序列中提取和过滤特征,允许监督分类器和回归器应用于时间序列数据
tslearn直接时间序列分类器和回归器
tspreprocess预处理时间序列(重采样、去噪等)
tsmoothie一个用于以向量化方式平滑时间序列和离群点检测的 python 库

数据集

项目描述
awesome-public-datasets庞大的公开数据库,包括时间序列
ecmwf_models气候分析数据的阅读器和转换器
M4 competition100000 时间序列预测比赛数据
pandas-datareader从不同来源获取金融数据 (e.g. yahoo, google, Quandl)
Timeseriesclassification.com时间序列分类数据集
multivariate-time-series-data多元时间序列预测数据集

  1. Chandola, Varun, Arindam Banerjee, and Vipin Kumar. “Anomaly detection: A survey.” ACM computing surveys (CSUR) 41.3 (2009): 1-58. ↩︎

  2. https://otexts.com/fppcn/tspatterns.html ↩︎ ↩︎ ↩︎

  3. https://otexts.com/fppcn/wn.html ↩︎

  4. https://towardsdatascience.com/the-time-series-transformer-2a521a0efad3 ↩︎