時間序列資料的交叉驗證方法 Cross Validation on Time Series data
最近接了一個跟時間序列資料預測有關的case,也因此開始惡補一些跟時間序列有關的知識。時間序列資料其實和正常的資料相比來說有許多不同的地方需要小心處理,其中一個我自己挺有印象的就是驗證方法上的不同,因此打算寫一篇 blog 來介紹幾個能夠在時間序列上使用的驗證方法。
為什麼正常的交叉驗證不可行?
這是因為正常的過程是基於隨機的切分資料,不論是 Boostrapping resampling, k-fold 或是 stratified k-fold 等等都一樣。想像如果你將一群有時間前後關係的資料打亂,可能會因為隨機性而拿未來的資料來預測過去,拿現在的資料預測過去,這在機器學習上完全不合理,因此我們必須用其他方法來避免掉這種 future-looking 的預測方式。
Walking Forward (Time Series Split ) Cross-Validation
既然我們只需要避免 future-looking,那麼我們的交叉驗證方法只需要確保使用的訓練資料其時間是早於測試資料即可。
舉一個例子來說,比如有一個時間序列資料集,照時間順序排列包含 [1, 2, 3, 4, 5]
- 第一個 iteration : Training: [1] , Test: [2]
- 第二個 iteration : Training: [1, 2], Test: [3]
- 第三個 iteration : Training: [1, 2, 3], Test: [4]
- 第四個 iteration : Training: [1, 2 ,3, 4], Test: [5]
最後將四個 fold 的模型表現平均起來就得到交叉驗證的最後結果
這種方法不僅能達成交叉驗證的核心思想,也就是要把所有資料都至少掃過一遍來驗證,以避免資料的偏誤。同時也比不使用交叉驗證,只將整個資料切成兩半,以時間較早的作為訓練,較晚的作為測試的方式都好很多。
除此之外也能夠在不同時間線上測試模型的表現有沒有不一樣,以便之後能夠對那個時間所發生的事件做深入分析。
Blocked Cross Validation
相較於 Walk Forward CV,Blocked CV 完全隔開了訓練資料以及測試資料的使用。
假如要分析一個網站流量隨著時間的增減,就更符合 Walk Forward 的情形,因為訓練資料是需要隨著時間而增加的,而且長期的記憶會有所幫助。
而若是要分析一間公司各年的每季財務,則更符合 Blocked 的情形,因為理論上這間公司去年的第一季與今年的第一季的情形會是類似的,但不同季的參考價值卻很低,以"季"做為一個 block 就可以得到基於季的時間序列分析結果。可以使用這去年的這一季來預測今年的這一季。
Nested Cross-Validation
Nested CV 是一個把模型參數最佳化與模型選擇放在一起做的方法,目標是為了克服在訓練資料上的 overfitting,以及避免在使用 CV 驗證模型的時候與在調參的時候所使用到重複的資料,因此而導致 Data Leakage。sklearn 有一篇介紹 non-nested 與 nested CV 差別的文章。
實作上 Nested CV 會將整個調參與驗證過程分為 Outer Loop 以及 Inner Loop,在 Outer Loop 中用來估計 test error,而在 Inner Loop 中是用來調整模型超參數。
若是要在單一個時間序列資料上使用 Nested CV,則一樣有兩種常用方式,Predict Second Half 以及 Day Forward-Chaining。
- Predict Second Half: 將資料切一半,只切分一次,把前一半時間的資料做為訓練和驗證資料集,後一半時間的資料做為測試集。這個方法雖然方便使用但測試資料集會只能用最新的那一半而已,使得測試資料集是受限的,可能會有潛藏的 bias。
- Day Forward-Chaining: 類似 Walk Forward,會切分多次,而每次的切分訓練、驗證、測試資料集都是不一樣的,就可以解決 Predict Second Half 的問題。
References:
- https://medium.com/eatpredlove/time-series-cross-validation-a-walk-forward-approach-in-python-8534dd1db51a
- https://medium.com/@soumyachess1496/cross-validation-in-time-series-566ae4981ce4
- https://towardsdatascience.com/time-series-nested-cross-validation-76adba623eb9
- https://machinelearningmastery.com/nested-cross-validation-for-machine-learning-with-python/
留言
張貼留言