《時間序列預測方法總結》
時間序列預測方法總結
BINGO Hong 剛出石油坑,又入資債坑。求撈我~ 蕭瑟 、 有道理 、 王晉東不在家 、 馬東什麼 、 SEU-AI蝸牛車 等這本來是我回答的一個問題:有什麼好的模型可以做高精度的時間序列預測呢? - BINGO Hong的回答 - 知乎 https://www.zhihu.com/question/21229371/answer/533770345
但覺得在那個答案下一直更新好麻煩,乾脆就移到自己主頁文章好了。
以後會在這裡更新,原答案不更新了。
- 時間序列基本規則法-週期因子法
- 提取時間序列的週期性特徵進行預測,參考:
- 計算週期因子factors
- 計算base
- 預測=base*factors
- 觀察序列,當序列存在週期性時,可以用週期因子法做為baseline
- 在天池競賽-資金流入流出預測-挑戰Baseline-天池大賽-阿里雲天池,週期因子可以取得110分+的成績,排名進500妥妥的。(後面有機會再貼程式碼)
2. 線性迴歸-利用時間特徵做線性迴歸
- 提取時間的週期性特點做為特徵,此時訓練集每條樣本為"時間特徵->目標值",時間序列的依賴關係被剔除,不需要嚴格依賴滑窗擷取訓練樣本。常見是將時間用0-1啞變量表達,有以下若干種特徵:
- 將星期轉化為了0-1變數,從週一至周天,獨熱編碼共7個變數
- 將節假日轉化為0-1變數,視具體節假日數目,可簡單分為兩類,"有假日"-"無假日",獨熱編碼共2個變數;或賦予不同編碼值,如區分國慶、春節、勞動節等使用1、2、3表示
- 將月初轉化為0-1變數,簡單分兩類表示為"是月初"-"非月初",共2個特徵
- 類似的月中、月初可以轉化為0-1變數
- 控制時間粒度,區分是weekday or weekend
- 觀察序列,當序列存在週期性時,線性迴歸也可做為baseline
- 在天池競賽-資金流入流出預測-挑戰Baseline-天池大賽-阿里雲天池,線性迴歸可以取得100分+的成績,應該還沒到500,多調節下特徵就能進去了。
3.傳統時序建模方法,ARMA/ARIMA等線性模型。參考:
- 寫給你的金融時間序列分析:基礎篇
- 自迴歸/滑動平均階數判斷Identifying the orders of AR and MA terms in an ARIMA model列舉了11條一般原則,其中提到:
- 差分方法可消除正相關但同時引入負相關
- AR項可消除正相關,MA項消除負相關
- AR項和MA項作用會相互抵消,通常包含兩種要素時可嘗試減少某項,避免過擬合
4.時間序列分解,使用加法模型或乘法模型將原始序列拆分為4部分。
- 拆分為4部分:長期趨勢變動T、季節變動S(顯式週期,固定幅度、長度的週期波動)、迴圈變動C(隱式週期,週期長不具嚴格規則的波動)和不規則變動I。參考:
- 乘法模型中SCI均為比例,加法模型中SCI與T有相同量綱。
- 迴圈變動C較為複雜,短期不體現或歸入趨勢變化中。
- 兩類平滑方法:
- 以滑動平均作為平滑方法提取趨勢的seasonal_decompose樸素分解。statsmodels.tsa.seasonal.seasonal_decompose
- 以魯棒區域性加權迴歸作為平滑方法的STL分解。statsmodels.tsa.seasonal.STL
- 季節性分析。資料中有季節性因素,與整體趨勢相比顯得比較弱。原文:Investigating Seasonality in a Time Series: A Mystery in Three Parts;中文:乾貨 | 季節性的分析才不簡單,小心不要在隨機資料中也分析出季節性
- 在天池競賽-資金流入流出預測-挑戰Baseline-天池大賽-阿里雲天池,時間序列分解方法也能取得很好的成績。(後面有機會試試這種方法)
5. 特徵工程著手,時間滑窗改變資料的組織方式,使用xgboost/LSTM模型/時間卷積網路等。參考:
- kaggle商品銷量預測1st的思路:特徵工程+LGBM/LSTM,1st place solution | Kaggle
- kaggle商品銷量預測5th的思路:特徵工程+LGBM/CNN-DNN/seq2seq,5th Place Solution | Kaggle
6. 轉化為監督學習資料集,使用xgboot/LSTM模型/時間卷積網路/seq2seq(attention_based_model)。參考:
- 如何用Python將時間序列轉換為監督學習問題 - 雲+社群 - 騰訊雲
- Keras中帶LSTM的多變數時間序列預測 - 雲+社群 - 騰訊雲
- 時間卷積網路(TCN) 總結:時序模型不再是遞迴網路(RNN) 的天下,但作為資訊粗暴提取的一種方法,請不要神話CNN !
- 演算法上可以引入注意力機制的seq2seq模型,見過純粹的seq2seq解法,結合注意力機制的還沒見過開原始碼(可能是搜尋不夠仔細)。
- seq2seq程式碼:Kaggle-Competition-Favorita/seq2seq
- 注意力機制資料:
- 臺大-李巨集毅《Attention_based_model》
- 他們只說注意力機制(Attention Mechanism)不練,還是我來給大家擼程式碼講解
- 盛源車:真正的完全圖解Seq2Seq Attention模型
- 《Attention is All You Need》淺讀(簡介+程式碼)
- 川陀學者:Attention機制詳解(二)——Self-Attention與Transformer
- The Illustrated Transformer
- Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)
7.Facebook-prophet,類似於STL分解思路,因為覺得在控制程度和可解釋性上比傳統時序模型更有優勢,所以單獨列車。參考:
- 官網說明(英文)
- 官網notbook(英文)
- 中文推薦 @張戎 的文章,從原理到使用都有介紹,很良心。張戎:Facebook 時間序列預測演算法 Prophet 的研究
- 個人理解,想進一步用好,可以好好看看論文和官網,有空擼遍python的原始碼
- 理解prior_scale在程式碼中如何實現控制趨勢項、季節項和節假日項
- 對於趨勢項引數changepoint_range、changepoint_prior_scale如何影響模型擬合和泛化程度
- 趨勢項中的Uncertainty-Intervals(interval_width引數)如何在預測結果使用
- 論文中的"Simulated Historical Forecasts"對應prophet的Diagnostics工具,可以利用該工具做時間序列的交叉驗證評價模型準確程度,如何利用該工具調整模型
8. 深度學習網路,結合CNN+RNN+Attention,作用各不相同互相配合。目前也只是看了論文,有程式碼的順便給出程式碼連結,程式碼還沒細看。
主要設計思想:
- CNN捕捉短期區域性依賴關係
- RNN捕捉長期巨集觀依賴關係
- Attention為重要時間段或變數加權
- AR捕捉資料尺度變化(沒太搞懂啥意思~)
方法:
- LSTNet: 適用於自相關圖表現出有明顯週期的時間序列,否則與傳統方法相當。LSTNet-Pytorch、LSTNet-Keras、LSTNet-Gluon(Mxnet)。
- TPA-LSTM: 改進了attention機制,側重選擇關鍵變數,而非選擇時間步;實驗效果說是對週期不明顯的時間序列也能有不錯效果。TPA-LSTM-Tensorflow
程式碼的坑填上。
- LSTNet程式碼解讀,BINGO Hong:LSTNet詳解
- TPA-LSTM注意力機制,BINGO Hong:TPA注意力機制(TPA-LSTM)
9.將時間序列轉化為影象,再應用基於卷積神經網路的模型做分析
- Gramian Angular Field (格拉姆角場GAF)
- 方法描述:將笛卡爾座標系下的一維時間序列,轉化為極座標系表示,再使用三角函式生成GAF矩陣。
- 計算過程:
- 數值縮放:將笛卡爾座標系下的時間序列縮放到[0,1]或[-1,1]區間
- 極座標轉換:使用座標變換公式,將笛卡爾座標系序列轉化為極座標系時間序列
- 角度和/差的三角函式變換:若使用兩角和的cos函式則得到GASF,若使用兩角差的cos函式則得到GADF
- 優勢:
- 極座標中半徑表示時間戳,角度表示時間序列數值
- 通過半徑r保持序列的時間依賴性
- 極座標保留時間關係的絕對值(翻譯得不好,大家可看原文:polar coordinates preserve absolute temporal relations)
- 每個序列產生唯一的極座標對映圖
- 可通過GAF矩陣的主對角線,恢復笛卡爾座標下的原始時間序列
- 缺點:
- 當序列長度為n時,產生的GAF矩陣大小為n*n,因此作者建議使用分段聚合近似(Piecewise Aggregation Approximation)保留序列趨勢同時減少序列大小。
- 參考:
- Short Time Fourier Transform (短時傅立葉變換STFT)
- 通用的語音訊號處理工具。在我畢業論文裡就有使用到,論文還沒上知網,連結後面再補吧。
- 將時間序列轉為時頻影象。
工具:
- tslearn:開源的時間序列機器學習python工具包
- tsfresh:開源的時間序列特徵提取python工具包
- pyts:開源的時間序列分類Python工具包。提供預處理工具及若干種時間序列分類演算法
難點:
- 理解時間序列預測問題是要用歷史資料預測未來資料
- 時間序列問題的訓練集、測試集劃分
- 特徵工程方法及過程(方法2的過程很有趣)
- 如何轉化為監督學習資料集
- LSTM計算過程理解,包括輸入輸出維度、引數數量等
- seq2seq過程的理解,decoder實現
- attention注意力機制的原理及實現,包括encoder-decoder attention, self attention, multi-head attention等
- 時間卷積網路的含義,顧名思義就是將CNN方法用於時間序列中,主要是dilated-convolution and causal-convolution
- prophet預測原理,各引數對模型擬合效果、泛化效果的影響
- TPA側重選擇關鍵變數
- 時間序列基本規則法中週期因子得計算過程
- 傳統方法如週期因子、線性迴歸、ARMA等的預測結果表現為,預測趨勢大致正確,但對波動預測不理想,體現在波動的幅度差異、相位偏移。
- 時間序列分解方法。理解加法模型和乘法模型,判斷分解模型的選取及分解技巧。
2018.11.26更新,新增第二點特徵工程的kaggle第5名方案解題思路,補充acf和pacf階數選取
2018.12.30更新,新增季節性分析問題
2019.1.20更新,新增prophet框架介紹及個人理解
2019.3.3更新,新增seq2seq模型及相應的注意力機制資料
2019.3.28更新,補充兩個時間序列工具tslearn、tsfresh
2019.4.8更新,補充LSTNet、TPA-LSTM,程式碼坑後面填
2019.4.20更新,LSTNet、TPA-LSTM程式碼填坑
2019.6.2更新,時間序列規則法-週期因子法
2019.6.20更新,線性迴歸方法預測
2019.8.9更新,時間序列分解法
2020.4.28更新,利用GAF方法將時間序列轉化為影象;補充時間序列工具pyts;STFT方法留個坑,後面在填