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