網路流量預測入門(三)之LSTM預測網路流量

段小輝發表於2021-08-29

網路流量預測入門(三)之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進行小波變換,然後將小波變換後的結果進行訓練。在預測的過程中,將預測結果進行反小波變換恢復成網路流量時間序列,可以有效的消除網路流量突變造成的影響。如果有興趣,值得試一試。

相關文章