深度學習與時間序列預測:來自Kaggle比賽的寶貴經驗

語言: CN / TW / HK

量化投資與機器學習微信公眾號,是業內垂直於 量化投資、對衝基金、 Fintech、人工智能、大數據 領域的 主流自媒體 公眾號擁有來自 、私募、券商、期貨、銀行、保險、高校 等行業 30W+ 關注者,榮獲2021年度AMMA優秀品牌力、優秀洞察力大獎,連續2 年被騰訊雲+社區評選為“年度最佳作者”。

作者:Ignacio Oguiza        編譯:1+1=6

前言

深度學習在時間序列預測中的重要性不斷增強。 神經網絡第一次在Kaggle時間序列競賽中位列前3名是在2015年(Rossmann store sales) 。從那時起,神經網絡就越來越常見地出現在排行榜的頭部。而且這種趨勢還在繼續。事實上,在最近的Ventilator Pressure Prediction時間序列比賽中,前15名的隊伍使用了神經網絡。

兩年前,作者創建了tsai深度學習庫,以便於使用最先進的深度學習模型和方法對時間序列數據進行建模與預測。

當上次Kaggle時間序列比賽結束時,我很想知道頂級隊伍是如何取得如此優異的成績的。因此,作者查閲了15個金牌獲得者團隊發佈的所有解決方案。這裏有一些關鍵的發現。

比賽簡介

在過去的兩個月裏,Kaggle舉辦了谷歌腦呼吸機壓力預測比賽。目的是模擬一個連接到鎮靜劑患者肺部的呼吸機。更具體地説,參與者必須預測在每次呼吸的吸氣階段肺部的壓力。

數據集由大約125k次模擬呼吸組成,其中60%被標記(訓練數據)。每次呼吸有80個不規則採樣的時間步,每個時間步有5個特徵。訓練集中的每一次呼吸都有一個80步的序列目標(壓力)。我們的目標是在測試數據中預測每次呼吸的序列。關鍵指標為平均絕對誤差(MAE)。

重要發現

明確任務

是一個序列到序列的任務,兩個序列並行發生。有趣的是,目標並不是完全連續的。每個目標步驟都是float類型,只有950個可能的值。正如預期的那樣,大多數頂級團隊將這個問題作為迴歸任務來處理。 然而,一些金牌得主成功地將比賽作為一個分類任務處理。他們預測了950種類型的概率。我很驚訝地發現分類方法如此有效。你可以用你自己的數據集試試!(如果你的數據是連續的,你總是可以創建離散目標箱)。

特徵

Top團隊使用了三種不同的方法:

  • 只用原始特徵。 只有獲勝的團隊在他們的一個模型中成功地使用了這種方法。為了彌補特徵的少量,他們使用了大量的epoch (2.5k)。

  • 原始特徵加上人為定義的特徵。 大多數團隊都遵循這條路線,通常會增加幾十個特徵。精心設計的、人工定義的特徵可以幫助模型更快地聚合,因此需要的時代更少。人工設計的特徵提供了利用專家領域知識提高性能的機會。

  • 原始特徵+人工定義的特徵+機器學習出來的特徵。 一些團隊將輸入信息通過一個具有多個卷積層的特徵提取器來學習新特徵。每個卷積層使用不同的核大小。

▌模型

LSTM和Transformer霸佔了排行榜,而CNN和增強樹模型沒有競爭力。

所有Top團隊都使用了神經網絡(深度學習)。與其他領域不同,增強樹沒有競爭力。沒有一個最好的解決方案包括增強樹。

主要使用的模型包括:

1、Stacked bidirectional LSTMs(一種遞歸神經網絡)主導了這場競賽。 幾乎所有的金牌得主都使用了LSTM模型的預測作為他們最終組合的一部分。如前所述,一些團隊通過在LSTM層之前添加特徵提取器來構建混合模型。

2、有些團隊使用了Transformer,但有些團隊説Transformer的效果不如LSTM。 在使用Transformer達到理想效果的方案中,Transformer模型只使用了編碼器部分,而沒有位置編碼,因為時間已經是特徵之一。另外兩個定製化的步驟是在Transformer之前添加捲積層和跳躍層。

自定義損失函數

自定義損失函數是Top團隊勝利的重要因素!

比賽使用MAE(平均絕對誤差)作為評估標準。因此,大多數參與者使用L1Loss或相關的loss(HuberLoss、SmoothL1Loss等)。 然而,幾乎所有Top團隊都使用了帶有輔助損失的多任務學習。他們在原有目標的基礎上增加了新的目標,以減少過擬合,提高泛化效果。

如前所述,這裏的目標是具有80個時間步的壓力序列。然而,頂級團隊修改了它來預測次要目標,比如:

  • 當前時間步與以前時間步(間隔1到4步)之間的壓力差,或

  • 每個時間步的累積壓力,或

  • 每個時間步長的壓力方差

壓力差和累積壓力的加入,迫使模型學習目標及其導數和積分,提高了模型的性能。

▌框架和硬件

當然大部分團隊建模選用的框架是TensorFlow或Pytorch,Scikit-learn主要用在數據預處理和交叉驗證的環節。TPU和GPU也非常重要,因為一個fold的訓練經常要花費數小時。

數據增廣

數據增廣是減少過擬合最好的方法。

很少有團隊能夠使用數據增廣的方法。但那些使用了數據增廣的團隊都顯著提高了模型的效果。主要的數據增廣的方法有:

  • Random shuffling of nearby time steps (based on a rolling window).

  • Random masking. During training, one of the categorical variables was set to zero.

  • Mixup

模型訓練

Top團隊使用大量的epoch來訓練他們的模型(通常在150到300之間,儘管有些人使用了高達2.5k!),它們都使用了一些學習速率調度器。Cosine Annealing和ReduceLROnPlateau 是最常用的兩種方法。至少有一個團隊聲稱使用Cosine Annealing With Warm Restarts.可以顯著提高性能。

複合模型

複合模型經常出現在Kaggle比賽中。這在這裏非常重要。原因是,當你使用平均絕對誤差(MAE)來評估一個預測時,通常使用中值比平均值更好。中值只有在有很多值的時候才準確。

所有Top團隊都創建了一個或多個強大的模型,並運行:

  • 多重摺疊(10到15 folds)

  • 或使用不同種子的所有訓練數據

  • 或者兩者的結合後處理。金牌獲得者使用了三種主要技術。

Pseudo-labels

一些最好的解決方案還利用未標記的數據集來生成額外的標籤。與上面描述的其他技術相比,這種技術的改進並不大。

結論

時間序列領域與計算機視覺和NLP的一樣,神經網絡逐漸的佔據了主導地位。

神經網絡加上領域專家知識可以顯著提高時間序列任務的性能。近年來,深度學習在時間序列中的應用發展迅速。它已經成熟,所以現在是開始使用它來解決時間序列問題的好時機。