• 网络流量预测入门(三)之LSTM预测网络流量


    网络流量预测入门(三)之LSTM预测网络流量

    在上篇博客LSTM机器学习生成音乐中,介绍了如何使用LSTM生成音乐,而在上上篇网络流量预测入门(二)之LSTM介绍中,介绍了LSTM的基本原理

    在这篇博客中,将介绍如何使用SVR和LSTM对网络流量进行预测。

    环境版本信息:

    • keras:2.4.3
    • numpy:1.19.2
    • tensorflow:2.4.1
    • sklearn:0.23.2

    项目地址:network-traffic-predict

    数据集介绍

    数据集来自欧洲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进行小波变换,然后将小波变换后的结果进行训练。在预测的过程中,将预测结果进行反小波变换恢复成网络流量时间序列,可以有效的消除网络流量突变造成的影响。如果有兴趣,值得试一试。

  • 相关阅读:
    Centos7新特性——systemd取代init管理服务
    Git初探
    Nginx内置变量
    Nginx初探
    PHP多进程初步
    golang消息队列nsq
    golang 的 go异步编程通道要注意的问题
    golang 连接池mysql
    golang centos运行方法
    golang go path和go mod的区别
  • 原文地址:https://www.cnblogs.com/xiaohuiduan/p/15202469.html
  • Copyright © 2020-2023  润新知