利用时间序列分析预测网络质量

使用的算法:AR模型,MA模型,ARIMA(组合)模型

数据:本案例使用航空乘客数据(AirPassengers.csv)作为样例,数据是从1949年到1960年间每个月的乘客量,格式如下图:

在使用算法预测前需要检验序列的稳定性,并消除趋势:

1. 检验时间序列的稳定性

如果一个时间序列的统计特征如平均数,方差随着时间保持不变,我们就可以认为它是稳定的。

稳定性的确定标准是非常严格的。但是,如果时间序列随着时间产生恒定的统计特征,根据实际目的我们可以假设该序列是稳定的。如下:

  • 恒定的平均数
  • 恒定的方差
  • 不随时间变化的自协方差

2.  消除趋势

      对时间序列需要做的消除趋势的工作,案例中提出了几种方法,最后使用的是转换。

转换(本例选择的方案)

  消除趋势的第一个方法是转换。例如,在本例中,我们可以清楚地看到,有一个显著的趋势。所以我们可以通过变换,惩罚较高值而不是较小值。这可以采用对数,平方根,立方根等等。本例使用转换为对数,即对原始时间序列做取对数处理。

 

移动平均数

在这个方法中,根据时间序列的频率采用“K”连续值的平均数。我们可以采用过去一年的平均数,即过去12个月的平均数。

 

指数加权移动平均法

所我们采取“加权移动平均法”可以对最近的值赋予更高的权重。指数加权移动平均法是很受欢迎的方法,所有的权重被指定给先前的值连同衰减系数。

 

消除趋势和季节性

  之前讨论来了简单的趋势减少技术不能在所有情况下使用,特别是在高季节性情况下。让我们谈论以下两种消除趋势和季节性的方法。

  • 差分:采用一个特定时间差的差值(本案例有使用到的)
  • 分解:建立有关趋势和季节性的模型和从模型中删除它们。

 

 

 

3.预测时间序列

 

我们需要使用统计模型像ARIMA(差分自回归移动平均模型)来预测数据。

当使用ARIMA模型时,需要指定p,d,q三个值,即ARIMA( p,d,q)建立三种情况下的模型:

自回归(AR)模型:当q为0时为AR模型

移动平均数(MA )模型:当p为0时为MA模型

组合(ARIMA)模型:其他情况

本案例中取d=1是因为需要做一次差分,使序列平稳;如果之前在消除趋势部分已经使用过一次差分处理过数据的话,则此处d=0。

其中p,q的选择是通过观察自相关函数(ACF)和部分自相关函数(PACF)的图来决定的,本案例中p=2,q=2;(方法和代码可参考链接,压缩包中无)

最后需要对预测数据结果根据之前的预处理进行逆运算,还原到原始数据的度量

下图是组合(ARIMA)模型的一个预测结果,是三个模型中效果最好的,标题为均方根误差RMSE=90.1044(由于AR和MA效果不如组合模型,故不贴出)

 

 

 

评价:

在本案例中,原文也有提到,预测的效果并没有特别好,而文章的目的是让读者了解建立模型的一个完整过程或者说是给一个思路。从如何分析序列的平稳性,到通过哪些消除趋势的方法使数据平稳,最后对处理后的数据建立模型进行预测。

分析本案例的效果不高的原因可能是数据量不够多,数据大概也就是十年左右,每年12个月,一共就145个数据。

改进的方向:

      可以尝试选择其他的消除趋势方法来对数据预处理。

      也可以尝试使d=2,增加差分的阶数。至于p和q应该在其他不变情况下不用修改,因为是按指定方法选择出来的。

本案例参考链接:

http://it.sohu.com/20160320/n441240758.shtml

在该链接中,关于AR,MA,以及组合模型的标题顺序可能有误。

此外,在另一个链接:

http://www.cnblogs.com/foley/p/5582358.html

同样使用的是航空乘客数据以及ARIMA模型(该链接的代码和上一个的差不多,就没有跑)

但是,在预处理上可能有所不同,它使用的是对数、移动平均(长度为12)以及一阶差分。发现其统计量在置信水平为95%的区间下并不显著,故在此基础上对其进行再次一阶差分后显著。

      之后同样观察图选择了模型的p,q值分别为1和1,此处它使用的是差分后的数据,故不需要设置d的值。

      最后同样需要根据预处理还原。该文章的结果比较好,取自文章截图,如下图:

      文章之后还有对模型小小改进和完善,此处就不写出。

 

 

 

使用的算法:LSTM模型

数据:本案例使用sp500.csv数据(貌似是股指)作为样例,序列长度为4171。

      本案例使用的LSTM是一种神经网络的算法。

      处理数据过程:将数据预处理并分割成含有input和label的形式,如以长度为50为例,则时间点1到50的点的向量作为输入,第51个点作为前50个点的预测结果即输出。同样时间点2到51用来预测低52个点。以此类推。

      将数据分为训练集和测试集。

      建立模型,此步是LSTM的难点,因为参数的选择和优化都是一大难点。

      训练数据。(在建立模型还是训练这一步代码跑了非常久时间,大约有2至3小时,之前还有一次跑了很久,结果代码还报错了,链接中的代码可能会报错,打包的压缩包是修改过的代码应该没有错,因此该模型没有做更多的数据尝试或对比其他算法)

      查看测试数据预测结果。文章将结果分为三种形式呈现

      1.直接预测,使用的是真实数据预测,效果比较好,但是评论中说,这个具有欺骗性,可能实用性不强。这部分内容在跑的代码里是有的,但是注释掉了,也不可能为了画它在跑两个多小时程序,因此所用的图是文章截图。

 

     

 

2.滚动预测,个人理解是每一次预测出的值,作为下一次预测的输入的一部分,不像直接预测每一次的输入都是真实数据。因此,偏差可能越来越大。情况同直接预测,用的是文章截图。

 

3.滑动窗口+滚动预测,个人理解是将上两种的结合,即在一定窗口长度内使用滚动预测,这样当下一个窗口刚刚开始执行时,使用的输入会有真实数据,而不像单独使用滚动预测一样全是预测数据。

 

 

 

评价:该模型是神经网络模型的一种,使用起来比较复杂,参数的选择可能需要长期使用的经验,而且模型建立和训练也比较耗时间。最后,结果效果就如图分三种情况所呈现,也不太好评价其好坏。但是之前在查找时间序列相关资料时,有看见过,股票价格有一些特性(本案例数据是股指可能类似),因此时间序列几乎是无法预测其变化。

 

在时间序列的调查报告中,有移动平均、指数平滑、STL分解(R语言实现)等模型,经过这次跑实例发现它们的主要作用应该不是用来预测时间序列,而是用来预处理序列,对其做去除趋势使其平稳,为后面模型的建立与预测服务的。

整个调查模型过程中或是查找代码实例中,发现ARIMA模型的资料和代码是最多的,它应该是实现时间序列一个比较常用或者说是传统的一个方法。

猜你喜欢

转载自blog.csdn.net/b0207191/article/details/87934548