時間序列預測任務可以按照不同的方法執行。最經典的是基於統計和自回歸的方法。更準確的是基於增強和集成的算法,我們必須使用滾動周期生成大量有用的手工特性。另一方面,我們可以使用在開發過程中提供更多自由的神經網絡模型,提供對順序建模的可定製的特性。
循環和卷積結構在時間序列預測中取得了巨大的成功。該領域中有趣的方法是通過採用最初在NLP中本地的Transformers和Attention架構。圖結構的使用似乎不常見,在圖結構中,我們有一個由不同節點組成的網絡,這些節點之間通過某種連結相互關聯。我們嘗試做的是使用時間序列的圖形表示來產生未來的預測。
在這篇文章中,我們完成了一個銷售預測任務,我們利用圖卷積神經網絡探索數據的嵌套結構,有不同商店中不同商品的不同銷售系列組成。
數據
數據集是從Kaggle上過去的競賽中收集的。 Store Item Demand Forecasting Challenge預測挑戰提供了4年的銷售數據,以每天的格式在不同的商店出售的不同的項目。我們有10家店,50種產品,共500個系列。每個商店都出售每種產品。我們的範圍是每天為所有項目提供準確的未來預測。
我們可以使用的數據很少:只有銷售額和商品和商店的數字編碼。這仍然足以讓我們強調一個基本的等級結構。我們所需要做的就是將這個系列按照商品級別進行分組,這樣我們就得到了50個組(商品),每個組由10個系列(每個商店中出售的商品)組成;上圖中描述了一個組的例子。
在經典的圖網絡中,所有相關信息都存儲在一個稱為鄰矩陣的對象中。這是數據中所有連接的數值表示。我們的上下文中的相鄰矩陣可以通過所有商店中給定商品的銷售序列計算得到的相關矩陣來檢索。
在我們的方法中,因為要像處理遞歸體系結構那樣將數據分片處理,所以需要對序列進行重新劃分,這也是我們模型的一部分。
模型
我們的模型作為輸入,接收來自所有商店的銷售序列和來自相同序列的相鄰矩陣。序列通過LSTM層,而相關矩陣則由圖形轉換層處理。它們是在Spektral中實現的,Spektral是一個基於Tensorflow的圖形深度學習庫。它有各種可用的圖形層。我們使用最基本的一種,圖形進化。它在可學習權重、外部節點特徵(與相鄰矩陣一起提供)和我們的相關矩陣之間執行一系列卷積操作。不太可能,目前Spektral不支持Window,所以我必須手動提取感興趣的類並創建Python可執行文件。
我們的模型接收來自所有商店的銷售序列和來自相同序列的相鄰矩陣作為輸入。序列通過LSTM層傳遞,相關矩陣由GraphConvolution層處理。它們是在Spektral中實現的,Spektral是一個很酷的庫,用於基於Tensorflow的圖形深度學習。它有各種可用的圖形層。我們使用最基本的一個,圖卷積GCN。它在可學習的權值、外部節點特徵(與鄰近矩陣一起提供)和我們的相關矩陣之間進行一系列卷積運算。目前Spektral不支持Window。
def get_model(): opt = Adam(lr=0.001) inp_seq = Input((sequence_length, 10)) inp_lap = Input((10, 10)) inp_feat = Input((10, X_train_feat.shape[-1])) x = GraphConv(32, activation='relu')([inp_feat, inp_lap]) x = GraphConv(16, activation='relu')([x, inp_lap]) x = Flatten()(x) xx = LSTM(128, activation='relu',return_sequences=True)(inp_seq) xx = LSTM(32, activation='relu')(xx) x = Concatenate()([x,xx]) x = BatchNormalization()(x) x = Dropout(0.5)(x) x = Dense(128, activation='relu')(x) x = Dense(32, activation='relu')(x) x = Dropout(0.3)(x) out = Dense(1)(x) model = Model([inp_seq, inp_lap, inp_feat], out) model.compile(optimizer=opt, loss='mse', metrics=[tf.keras.metrics.RootMeanSquaredError()]) return model
如前所述,在開發遞歸網絡時,數據總是像往常一樣被處理。序列一個在固定的時間內的商店的產品的銷售集合。
在我們的例子中,下一步的步驟是在相同的序列上計算商店間銷售的相關矩陣,它表示我們的相鄰矩陣。同時還有一些人工特徵(如均值、標準差、偏度、峰度、回歸係數),由我們對每個序列進行計算,代表我們在網絡中的節點特徵。
對於給定的樣本協方差或相關矩陣,我們可以使用拉普拉斯(Laplacian)歸一化來估計鄰接矩陣,該歸一化可以基於譜卷積的一階近似來提供高效的逐傳播規則(前向和後向傳播)。
訓練集是用前兩年的數據計算的,而剩下的兩年分別用於驗證和測試。我為每個商店訓練了一個模型,所以我們總共有10個不同的神經網絡。
在訓練過程的最後,通過相關模型對預測結果進行檢索。誤差以測試數據上的RMSE計算,下面是報表展示。
以同樣的方式,很容易提取所需預測數據
總結
在這篇文章中,我採用了圖形神經網絡在不常見的情況下,如時間序列預測。在我們的深度學習模型中,圖依賴與遞歸部分相結合,試圖提供更準確的預測。這種方法似乎很適合我們的問題,因為我們可以強調數據中的基本層次結構,並用相關矩陣對其進行編碼
作者:Marco Cerliani