天天看点

用LSTM进行时间序列预测

LSTM(long short-term memory)长短期记忆网络是一种比较老的处理NLP的模型,但是其在时间序列预测方面的精度还是不错的,我这里以用“流量”数据为例进行时间序列预测。作者使用的是pytorch框架,在jupyter-lab环境下运行。

输出的结果如下:

用LSTM进行时间序列预测

ds表示时间戳,y是每个时间段对应的流量值。为了看的更方便,将ds转换为标准格式

结果如下:

用LSTM进行时间序列预测

为了进行模型的评估,我们需要将数据划分成训练集和测试集,这里我以最后24个小时(即一天)作为测试集:

用LSTM进行时间序列预测

为了消除值的量纲的差异,同时,由于神经网络对于数据较大的值比较敏感,运算会增加复杂度,因此我们将训练集进行标准化,这里我采用z-score标准化,即:

\[X = \frac{X-\mu}{\sigma},

\]

注意,这里只能将标准化运用到训练集上,如果运用在测试集上则会造成数据泄露,相当于已经看过了测试集,那么训练就没有意义了。

由于pytorch只能对tensor类型的数据进行训练,故需要转化:

我们采用滑动窗口的形式进行sequence的制作,这里我以168小时(一周)的数据来预测后24小时(一天)的数据,所以我们标签窗口的大小为168,标签窗口的大小为24。相当于每168个数据预测完后24个数据后,窗口向右移动一位,用下一个168数据预测后24个数据,直到看完所有的训练集:

用LSTM进行时间序列预测

可以看到,每个训练样本由168个输入值和24个标签值组成

前5个预测值

用LSTM进行时间序列预测
用LSTM进行时间序列预测

由图可以看到预测的结果还是不错的

模型的准确率计算公式为:

\[Accuarcy=\left(1-\sqrt{\frac{1}{n}\sum_{i=1}^n E_i^2}\right)\times 100\%

其中n为预测总数,\(E_i\)为某一点的相对误差,计算公式为:

\[E_i=\frac{|actual-predict|}{actual}\times 100\%

用LSTM进行时间序列预测

模型的最终准确率为93.38%,可以看到效果还是不错的,如果继续调整学习率和迭代次数,搭配交叉验证和网格搜索,效果应该会更好一点。

继续阅读