首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实习生的监控算法: 利用时间序列模型进行曲线预测

实习生的监控算法: 利用时间序列模型进行曲线预测

原创
作者头像
解飞
修改2017-07-26 11:34:03
4.9K0
修改2017-07-26 11:34:03
举报

导语

各位老司机晚上好啊,这是我实习阶段的最后一篇文章,关于时间序列模型在曲线预测上的应用,会展示出一个较为完整的时间序列建模的过程。主要讲述了如何进行曲线预测以便可以提前做出一些准备,比如说告警策略的改变或者配置上的更改,提高告警的准确率。主要内容包括时间序列模型的简介,数据处理与平稳性验证,最后是模型评估预测和进一步思考。一篇水文,求老司机指导......

一.时间序列模型简介

时间序列模型就是对一组变量进行一段时间的观测所得出来的一组时间有序的序列,可分为平稳序列和非平稳序列,其中平稳序列又可分为宽平稳和严平稳序列,下面对这两种序列给出直观的定义:

严平稳序列: 只有当序列所有的统计性质都不会随着时间的推移而发生变化时,该序列才能被认为平稳。比如说白噪声(white noise)序列,期望E(X(t))为0,方差D(x(t))为常数, 协方差为0。

宽平稳序列: 形式化定义需要借助二阶矩过程,这里直接给出结论。给定随机序列X(t),如果E[X(t)]为常数且E[X^2(t)] < +∞, Rx(t,t+Δ)=E[X(t)X(t+ Δ)]=Rx(Δ),Δ = t1 - t2, 这个式子说明E(X*Y)只与时间间隔有关。就是满足常数均值,常数方差,常数自协方差。

摆出了平稳序列的定义,然后用了几个曲线数据试了一下,平稳处理过后(差分,取自然对数),大部分都满足宽平稳时间序列的定义。

然而,实际中的大部分时间序列都是不平稳的,比如说周期性序列或者定时任务这种序列。为了接下来能够使用ARIMA模型,需要对数据进行预处理。下面主要说下数据处理的理由和方法,还有怎样验证时间序列的平稳性。

二. 数据处理与平稳性验证

2.1 数据处理

为什么要进行数据处理? 为了使得数据更加符合模型的假设,因为不论AR(自回归)模型,MA(滑动平均)模型还是ARIMA(自回归滑动平均)模型,假设就是要求输入序列是一个平稳序列。要使模型有更好的表现,进行数据预处理是必要的。

其实在做数据预处理的时候我有一个困惑,就是说预处理的时候会不会丢失原序列的信息?这个问题在知乎上有一个解答,答主举了几个简单的例子说明做为什么可以做数据处理和这种操作的必要性,总结一下就是说,1.数据预处理可以让数据更符合模型,比如说我假设后来的序列残差服从正态分布,这样就可以用已有的理论验证这套模型是否可用。2. 数据预处理可以更好的发现数据之间的关系,比如说一些数据取一个自然对数(loge)之后,呈现出明显的线性关系,下面是从知乎上截的图就说明了这种情况。

下图的左图是各国人均GDP和城市人口数量的关系,可以发现人均GDP是严重左偏的,并且可以预知在回归方程中存在明显的异方差性,但如果对GDP进行对数变换后,可以发现较明显的线性关系(右图)。

图1 GDP原始数据和对数变换后的数据

2.2 数据预处理方法

前面说到,大部分的时间序列都是不平稳的,为了使数据趋于平稳,常用的方法有差分和取对数方法。

差分(difference)法,直观理解就是后一个数据与前一个数据的差值称为一阶差分,二阶差分就是在一阶差分的基础上在做一次差值。一般来说做两次差分后的序列基本上就满足平稳性要求了。

对数(logarithm)法,取对数也是一种平稳处理方法,主要是减少数据的震动幅度。而且就像前面那个图,比较容易发现数据之间的规律(线性规律)。

分解法,我在看数据挖掘这本书时,可以把时间序列分为三个部分,趋势,季节和随机成分,得到不同的分解成分后,可以对不用的成分进行拟合。statsmodels有这样的函数seasonal_decompose,可以对时间序列进行分解。就像下面这张图(引用的):

图2 分解过后的序列数据

2.3 序列平稳性检验

对数据进行预处理过后,如何评估处理后的序列已经平稳了呢。下面是几种比较常见的检验序列平稳性的方法。

1.用眼睛看(比较粗暴)

这种方法就是把差分后的数据画出来,观察是否为白噪声数据,就像下面这张图。

图3 一阶差分后像白噪声的数据

如果数据预处理后得到类似这样的结果,就可以认为此时的数据已经达到平稳性的要求,

2.画出自相关和偏相关图

如果自相关图(acf)和偏相关图(pacf),如下图所示,如果自相关图和偏相关图有明显的截尾或者拖尾的特征,则此时认为数据是平稳的。

所谓的截尾或者拖尾就是说图上的点在一定的阶数后为0 或者在一定的阶数后趋近于0。如下图所示:

图4 自相关系数和偏相关系数图

3.ADF单位根检验(最常用的方法)

Augmented Dickey–Fuller test 扩展迪基-福勒检验,这个检验的原假设H0: 序列是非平稳序列。

关于ADF单位根检验的数学原理比较复杂,想要深入理解原理的老司机可以参考附件中的ppthi还有那本应用时间序列分析的教材,这里我简单说下这个ADF的结果怎么分析。

statsmodel中有一个方法叫adfuller,是专门用来做单位根检验的函数。如下图所示,对于某一个曲线返回的ADF单位根检验的结果:

主要关注上图中pvalue的值,这个值越小,则说明序列是平稳的,因为拒绝了原假设H0: 序列非平稳。也可以从另外一个角度说明: 如果Test statistic小于Critical value则也可以拒绝原假设H0,序列是平稳序列。

三.模型选择与预测

在进行数据处理与平稳性检验后,就可以开始建模进行预测了。先描述模型选择过程,之后是模型预测过程。

3.1 模型选择

模型的选择主要是根据之前的自相关图和偏相关图进行判断,然后用信息量法则判断(赤池信息量,贝叶斯信息量等)。首先来介绍根据图形来判断建立的模型。

图4 自相关系数和偏相关系数图

根据上图,可以看到acf(自相关图)在一阶过后存在明显的截尾,而pacf(偏相关图)缓慢下行,存在拖尾特征。所以可以选择MA(滑动平均)模型。反之,如果acf缓慢下行,存在拖尾特征而pacf存在截尾过程,则可以选择AR(自回归模型)。如果acf和pacf都存在拖尾特性,则可以选择ARMA模型。

上图中,acf滞后1阶后缩小为0,pacf滞后7阶后缩小为0。所以可以选择MA(1,7)或者ARMA(1,7)模型。

3.2 模型预测

选定模型之后,接下来就是模型的评估。模型的评估主要从预测效果来看吧,其实还信息量评估(赤池,贝叶斯),德宾-沃森(Durbin-Watson)检验,残差序列Ljung-Box检验,这些检验都需要做,但是展示起来不直观。感兴趣的老司机可以参考附件中的那本书或者博客。咱们直接来看预测结果。

这里用的模型是ARMA(0,7)模型,预测效果如下图所示:

预测准确度衡量采用均方根误差衡量,可以看到图5中均方根误差为93.3097。对于三天的数据基本可以接受,预测效果比较理想。

图5 预测数据(3天)

图6 实际数据(3天)

感觉效果还不错,但是后来仔细的分析上图和结果输出之后。发现实际上这个结果有点过拟合(overfitting)了,我看了输出感觉就是在真实数据上下浮动了一些值。同时我也看到了一些论文指出了这个问题,就是时间序列模型预测出的结果可能就是真实值的上下波动或者是单纯的时间轴平移,这个问题我也比较困惑。为啥会产生这样的结果,其实仔细想一下,如果这次测试数据周期性变化明显,而且不会突变,那么这个结果是可以接受的。但是监控其他类型的曲线是否也能使用时间序列分析呢,尤其是定时任务和毛刺数据这种很不平稳的时间序列。

四.结尾

关于时间序列模型我就做了这么点工作,KM上有老司机的结果相当好,但同样,当数据出现突变或者波动较大的时候,准确率也有所下降。跟师父讨论之后,觉得预测这个东西确实比较难,我用到工具是Python的pandas和statsmodels库,看老司机们都用R语言来做预测,后面我也尝试一下,看能不能获得更好的结果。研究时间序列我一开始的想法是想做预告警,比如说预测出来下一天的数据,看看能不能提前预知一些可能会发生问题的位置。时间序列就先学习到这里,先把这个想法记录一下,后续的工作还是会接着研究曲线分类的问题。

参考文章

1.http://www.cnblogs.com/foley/p/5582358.html 一篇博客,主要讲述怎样用python进行时间序列分析

2.https://www.zhihu.com/question/31833683 知乎上的文章,主要讲解时间序列建模的步骤

3.https://www.zhihu.com/question/22012482 这个主要解释了为什么要进行数据的预处理

4.http://www.jianshu.com/p/cced6617b423 简书上的文章,提供了很多关于时间序列丰富的材料

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导语
  • 一.时间序列模型简介
  • 二. 数据处理与平稳性验证
    • 2.1 数据处理
    • 2.2 数据预处理方法
      • 2.3 序列平稳性检验
      • 三.模型选择与预测
        • 3.1 模型选择
          • 3.2 模型预测
          • 四.结尾
          • 参考文章
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档