网络流量预测入门(三)之LSTM预测网络流量
在上篇博客LSTM机器学习生成音乐中,介绍了如何使用LSTM生成音乐,而在上上篇网络流量预测入门(二)之LSTM介绍中,介绍了LSTM的基本原理
在这篇博客中,将介绍如何使用SVR和LSTM对网络流量进行预测。
环境版本信息:
- keras:2.4.3
- numpy:1.19.2
- tensorflow:2.4.1
- sklearn:0.23.2
数据集介绍
数据集来自欧洲11个城市的ISP互联网流量(用ec_data表示)和英国学术网流量(用uk_data表示),数据集见Github。
ec_data统计了从2005年7月6号至2005年7月28号共计14772组网络流量数据,uk_data统计了从2004年11月19号至2005年1月27号共计19888组网络数据。ec_data和uk_data都是以5分钟为间隔进行采样得到的数据,数据见下图。由图中可以看出,ec_data和uk_data具有很强的周期性以及规律性,因此可以大胆的搏一搏单车变摩托:LSTM在预测的时候能够有着比较好的结果。
预测流程
在这篇博客中,使用前10个序列去预测下一个时间序列的网络流量值。当然,也可以如同简单明朗的 RNN 写诗教程一样,通过前10个序列去预测后面\(N\)个序列的网络流量值,如下图所示。
数据集准备
流量预测的目的是使用前\(K\)个序列去预测后面\(N\)个序列(这篇博客\(K=10,N=1\)),从机器学习训练的角度去看,前\(K\)个序列为\(X\),后面\(N\)个序列则为\(Y\)。因此,需要从网络流量数据中构建数据集。构建数据集的过程原理在简单明朗的 RNN 写诗教程详细说过,以诗为例,过程如下:
通过上面的操作,就可以将网络流量序列变成X_Data和Y_Data,部分代码如下:
# all_data 即为数据集,sequence_len即为K
sequence_len = 10
X = []
Y = []
for i in range(len(all_data)-sequence_len):
X.append(all_data[i:i+sequence_len])
Y.append(all_data[i+sequence_len])
X = np.array(X)
Y = np.array(Y)
SVR预测
SVR使用sklearn提供的默认参数,默认参数设置如下:
超参数 | 取值 |
---|---|
kernel | rbf |
gamma | scale |
tol | 0.001 |
C | 1.0 |
代码见:Github,使用SVR进行预测还是挺简单的,看看代码就能够看懂了。
预测结果图如下图所示:
-
ec_data:MAPE=0.095
-
uk_data:MAPE=0.084
LSTM 预测
LSTM的模型结构如下图所示,是一个很简单的双层LSTM网络,并没有加入一些特殊的结构。
代码见:Github
预测结果:
-
ec_data:MAPE=0.040
-
uk_data:MAPE=0.035
优化点
可以将uk_data和ec_data进行小波变换,然后将小波变换后的结果进行训练。在预测的过程中,将预测结果进行反小波变换恢复成网络流量时间序列,可以有效的消除网络流量突变造成的影响。如果有兴趣,值得试一试。