時間序列預測的五種策略
時間序列預測的五種策略
簡 介
時間序列預測就是利用過去一段時間的資料來預測未來一段時間內的資訊,包括連續型預測(數值預測,範圍估計)與離散型預測(事件預測)等,具有非常高的商業價值。
通常,時間序列預測描述了預測下一個時間步長的觀測值。這被稱為“單步預測”,因為僅要預測一個時間步。例如,給定最近7天觀察到的溫度:
單步預測僅需要在時間步驟8進行預測。在一些時間序列問題中,必須預測多個時間步長。與單步預測相比,這些稱為多步時間序列預測問題。
在開始之前,需要明確一些一直很模糊的問題,也就是時間序列預測的資料形式,我們平常在公眾號的一些blog裡看到的時間序列預測的資料形式都很簡單,並且基本都是單個序列,單變數
當然我們可以對每個序列單獨用arima之類的方法來建模,理論上可以,但是實際上基本不可能,一方面維護成千上萬的模型的成本是不可估計的,另一方面不同商品的序列長度差異很大,有的序列長度可能非常完整有1500+個序列資料,有的冷門商品或者是新上的商品序列長度很短可能只有不到10個,這種情況下,後者基本沒法單獨建模。
因此實際上我們常見的業務問題的資料形式是這樣的:
這也是web traffic,m5 forecast,favorite store 這些序列比賽的資料的普遍形式,可以說我們面對的主要的問題形式是這樣的。
對這些資料進行建模的時候我們面臨最直接的問題就是,使用多少的時間步的歷史資料預測未來多少個時間步的未來資料,即時間窗的問題,比如我們就用前一天的資料預測後一天的,那麼資料就要變成:
這就是我們的所謂的滯後特徵,也是時間序列問題中最常見的也是最重要的特徵衍生方法。
一般來說,時間距離約接近的滯後特徵對於預測的準確的貢獻越大。所以我們會用所謂的視窗的問題,比如你使用 “1階滯後 2階滯後……n階滯後”來預測未來,則你的時間窗的長度為n,當然這個時間窗不一定連續,你可以使用“1階滯後,3階滯後,7階滯後……n階滯後”等,但是你的時間窗長度仍舊為n,只不過滯後特徵的數量變少了而已。
除此之外,還有一個就是gap的問題,也就是提前多少天預測
為了便於描述,這裡假設一個序列:[1,2,3,4,5,6,7,8,9,10,X,Y,Z]
我們要做的是預測未來的3個時間點,X,Y,Z的序列的值,並且為了方便描述,這裡我們統一僅僅使用1階滯後特徵。
第一種:直接多步預測
直接多步預測的本指還是單步預測,多步轉單步,比如上面我們要預測3個時間點的序列的值,則我們就構建3個模型:
model1:[1,2,3,4,5,6,7,8,9],[X]
model2:[1,2,3,4,5,6,7,8,9],[Y]
model3:[1,2,3,4,5,6,7,8,9],[Z]
這種做法的問題是如果我們要預測N個時間步,則複雜度很高,比如預測未來100天,則意味著我們要構建100個模型;
另外需要注意的是,在使用這種方法的時候,我們在進行特徵工程的時候要比較小心,因為我們在序列問題的特徵工程過程中常常會涉及到一些lag方法,即滯後特徵的引入,比如對於:model1:[1,2,3,4,5,6,7,8,9],[X]
我們可以構建一階滯後特徵:[1,2,3,4,5,6,7,8,9],[nan,1,2,3,4,5,6,7,8],而待預測的X的一階滯後是9,是我們已經觀測到的值,因此取1階滯後沒有問題。
但是對於:model2:[1,2,3,4,5,6,7,8,9],[Y] 我們無法使用1階滯後,因為Y的一階滯後是X,X並不是我們的觀測值,這個時候我們的滯後特徵只能從二階滯後開始做起
對於後續的model3,model4等,基本是一樣的道理
這裡我們僅僅使用了1階滯後,所以時間窗長度是 1。
另外需要注意的是,時間窗的長度和我們處理無序的結構化問題有一些區別,我們直觀的感受是,長度的概念對應的是樣本的數量,但是實際上在結構化資料中,對應的是特徵的維度,比如:
這就是滑動視窗的概念,當我們使用n階滯後特徵訓練了一個模型之後,我們可以稱這個模型為n階滯後模型。
直接預測方法的缺點在於可能會出現較高的方差,特別是如果我們要預測的時間步長比較長的情況下,比如我們要預測未來100個時間步驟,則第100個時間步驟使用的最近的一樣觀測樣本是100個時間步之前的,我們直到,週期約接近當前時間點的滯後特徵預測效果越好,間隔時間越長效果越差。
第二種:遞迴多步預測
遞迴多步預測,遞迴多步預測的本質還是簡單的單步預測,但是和第一種情況不同,遞迴多步預測不需要預測 時間步個模型,僅僅一個模型就夠了。舉個例子,假設我們構建了一個3階滯後模型:
則當我們預測的時候,還是以上面的例子為例:
[1,2,3,4,5,6,7,8,9,10,X,Y,Z]
我們先預測X,即根據:
用model 去 predict([8,9,10]) 得到 prediction(X),假設predict出來的結構為11.24,然後我們把預測值當作特徵,得到[9,10,11.24],然後用model去predict([9,10,11.24])得到prediction(y),依此類推。
由於使用預測代替真實值,因此遞迴策略會累積預測誤差,即遞迴策略的偏差比較大,從而隨著預測時間範圍的增加,模型的效能可能會迅速下降。
第三種:直接+遞迴的混合策略
可以將直接策略和遞迴策略結合使用,以提供這兩種方法的好處。
例如,可以為要預測的每個時間步構建一個單獨的模型,但是每個模型都可以將模型在先前的時間步進行的預測用作輸入值。
思路也不復雜,和直接預測一樣我們要根據n個時間步構造n個模型,還是以原來的例子為例:[1,2,3,4,5,6,7,8,9,10,X,Y,Z]
我們先構造一個3階滯後的model 1:[8,9,10][X],然後用model1 進行預測得到prediction(X),然後我們構造model2 ,按照直接預測法的思路,
model2應該是無法將X作為觀測樣本進行訓練,因此model2可以是[8,9,10][Y],當然,使用直接預測法不一定要構造相同的n階模型,也可以是[7,8,9,10][Y]……依此類推,但是核心都是無法使用X處的資料,因為X是未知的沒有觀測到的值,
那麼混合策略的做法是,我們用model1預測X得到prediction(X),然後將這個prediction(X)作為model2的”觀測“資料,納入模型訓練,即:
依此類推。
第四種:多輸出策略
為什麼會有上述三種策略呢?本質原因是傳統的機器學習演算法無法正常處理多輸出問題,多步預測的本指是多輸出,我們需要多輸出模型才能在一個模型裡預測多個標籤,比如 預測未來的3步是一個3輸出模型,這個概念就類似於我們的多標籤分類、多標籤迴歸的概念。實際上針對於直接預測法,就是一種常見的使用傳統的機器學習演算法解決多標籤問題的轉化方法,而遞迴預測法本質上還是普通的簡單的單標籤問題。
但是深度學習可以很容易的打破這樣的限制,這裡介紹第四種策略:多輸出策略。
注意,直接進行多輸出,則model的形式是:
model 多輸出:[8,9,10][X,Y,Z]
傳統的機器學習演算法包括lr gbdt無法直接構建多輸出模型而要藉助於直接預測、遞迴預測或者混合策略,但是神經網路可以打破這樣的限制,nn可以非常靈活的支援多輸入或者多輸出的形式。
我們只需要把這裡的main_output的Dense層的神經元個數設定為 n就可以(n是要預測的未來的時間的步數)。
這是常見的使用nn進行多步預測的網路設計,特點就只是輸出層的nn根據預測的時間步數進行設定而已。
有沒有發現和序列標註問題的形式非常類似?早期使用nn來處理序列標註(序列標註問題是一個多分類問題),簡單直觀的思路就是輸出接一個n分類層。
這種方法的問題就是,我們的標籤如果是時序依賴的,比如時間序列預測未來3個時間步驟t+1,t+2,t+3,如果我們直接使用多輸出的方式,則 t+1,t+2,t+3 三個標籤我們其實是認為它們是完全獨立的,但是實際上它們是存在序列依賴性的,這個問題和序列標註早期的簡單方法存在的問題是一樣的,就是沒有考慮標籤的序列依賴的性質。因此就誕生了第五種策略,也是基於深度學習的方法。
第五種:seq2seq結構
這是一個常見的問答系統的seq2seq結構,以上面的例子為例:
[1,2,3,4,5,6,7,8,9,10][X,Y,Z],我們可以直接構造上述seq2seq結構的輸入輸出樣本,假設我們使用3階滯後,預測未來的3個時間步,則樣本構造為:
在seq2seq的結構中,我們使用LSTM或者CNN的網路結構作為encoder和decoder的元件即可,這種情況下,當然,attention+seq2seq,transformer,bert等網路結構都可以直接處理這樣的問題。
並且,他們都可以考慮輸出的標籤之間的序列依賴性。