1. 程式人生 > 其它 >LazyProphet:使用 LightGBM 進行時間序列預測

LazyProphet:使用 LightGBM 進行時間序列預測

當我們考慮時間序列的增強樹時,通常會想到 M5 比賽,其中前十名中有很大一部分使用了 LightGBM。但是當在單變數情況下使用增強樹時,由於沒有大量的外生特徵可以利用,它的效能非常的糟糕。

首先需要明確的是M4 比賽的亞軍 DID 使用了增強樹。但是它作為一個元模型來整合其他更傳統的時間序列方法。在 M4 上公開的程式碼中,所有標準增強樹的基準測試都相當糟糕,有時甚至還達不到傳統的預測方法。下面是Sktime 包和他們的論文所做的出色工作[1]:

任何帶有“XGB”或“RF”的模型都使用基於樹的整合。在上面的列表中 Xgboost 在每小時資料集中提供了 10.9 的最佳結果!然後,但是這些模型只是Sktime 在他們框架中做過的簡單嘗試,而 M4 的獲勝者在同一資料集上的得分是 9.3 分……。在該圖表中我們需要記住一些數字,例如來自 XGB-s 的每小時資料集的 10.9 和每週資料集中的樹性模型的“最佳”結果:來自 RF-t-s 的 9.0。

從上圖中就引出了我們的目標:建立一個基於LightGBM並且適合個人使用的時間序列的快速建模程式,並且能夠絕對超越這些數字,而且在速度方面可與傳統的統計方法相媲美。

聽起來很困難,並且我們的第一個想法可能是必須優化我們的樹。但是提升樹非常複雜,改動非常費時,並且結果並不一定有效。但是有一點好處是我們正在擬合是單個數據集,是不是可從特徵下手呢?

特徵

在檢視單變數空間中樹的其他實現時都會看到一些特徵工程,例如分箱、使用目標的滯後值、簡單的計數器、季節性虛擬變數,也許還有傅立葉函式。這對於使用傳統的指數平滑等方法是非常棒的。但是我們今天目的是必須對時間元素進行特徵化並將其表示為表格資料以提供給樹型模型,LazyProphet這時候就出現了。除此以外,LazyProphet還包含一個額外的特徵工程元素:將點”連線”起來。

很簡單,將時間序列的第一個點連線起來,並將一條線連線到中途的另一個點,然後將中途的點連線到最後一個點。重複幾次,同時更改將哪個點用作“kink”(中間節點),這就是我們所說的“連線”。

下面張圖能很好地說明這一點。藍線是時間序列,其他線只是“連線點”:

事實證明,這些只是加權分段線性基函式。這樣做的一個缺點是這些線的外推可能會出現偏差。為了解決這個問題,引入一個懲罰從中點到最後點的每條線的斜率的“衰減”因子。

在這個基礎上加滯後的目標值和傅立葉基函式,在某些問題上就能夠接近最先進的效能。因為要求很少,因因此我們把它稱作“LazyProphet”。

下面我們看看實際的應用結果。

程式碼

這裡使用的資料集都是開源的,並在M-competitions github上釋出。資料已經被分割為訓練和測試集,我們直接使用訓練csv進行擬合,而測試csv用於使用SMAPE進行評估。現在匯入LazyProphet:

完整文章:

https://www.overfit.cn/post/00e8c0fc47ea47e4abfb49d5ae71707c