1. 程式人生 > 實用技巧 >《時間序列預測方法總結》

《時間序列預測方法總結》

時間序列預測方法總結

BINGO Hong 剛出石油坑,又入資債坑。求撈我~ 蕭瑟 有道理 王晉東不在家 馬東什麼 SEU-AI蝸牛車

這本來是我回答的一個問題:有什麼好的模型可以做高精度的時間序列預測呢? - BINGO Hong的回答 - 知乎 https://www.zhihu.com/question/21229371/answer/533770345

但覺得在那個答案下一直更新好麻煩,乾脆就移到自己主頁文章好了。

以後會在這裡更新,原答案不更新了。


  1. 時間序列基本規則法-週期因子法

2. 線性迴歸-利用時間特徵做線性迴歸

  • 提取時間的週期性特點做為特徵,此時訓練集每條樣本為"時間特徵->目標值",時間序列的依賴關係被剔除,不需要嚴格依賴滑窗擷取訓練樣本。常見是將時間用0-1啞變量表達,有以下若干種特徵:
    • 將星期轉化為了0-1變數,從週一至周天,獨熱編碼共7個變數
    • 將節假日轉化為0-1變數,視具體節假日數目,可簡單分為兩類,"有假日"-"無假日",獨熱編碼共2個變數;或賦予不同編碼值,如區分國慶、春節、勞動節等使用1、2、3表示
    • 將月初轉化為0-1變數,簡單分兩類表示為"是月初"-"非月初",共2個特徵
    • 類似的月中、月初可以轉化為0-1變數
    • 控制時間粒度,區分是weekday or weekend
  • 觀察序列,當序列存在週期性時,線性迴歸也可做為baseline

3.傳統時序建模方法,ARMA/ARIMA等線性模型。參考:

4.時間序列分解,使用加法模型或乘法模型將原始序列拆分為4部分。

5. 特徵工程著手,時間滑窗改變資料的組織方式,使用xgboost/LSTM模型/時間卷積網路等。參考:

6. 轉化為監督學習資料集,使用xgboot/LSTM模型/時間卷積網路/seq2seq(attention_based_model)。參考:

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捕捉資料尺度變化(沒太搞懂啥意思~)

方法:

程式碼的坑填上。

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方法留個坑,後面在填