使用 TiDE 進行時間序列預測
今天云朵君和大家一起學習一種新穎的時間序列預測模型 - TiDE(Time-series Dense Encoder)。
時間序列預測一直是數據科學領域的一個熱門研究課題,廣泛應用于能源、金融、交通等諸多行業。傳統的統計模型如ARIMA、GARCH等因其簡單高效而被廣泛使用。而近年來,隨著深度學習的興起,基于神經網絡的預測模型也備受關注,表現出了強大的預測能力。
其中,Transformer模型因其出色的捕捉長期依賴關系的能力,一度被認為是解決時間序列預測問題的利器。但最新研究發現,這些基于Transformer的模型在長期預測任務中,性能并不如人意,反而被一些簡單的線性模型超越。
有鑒于此,谷歌的研究團隊在2023年提出了TiDE模型。該模型摒棄了Transformer的復雜結構,轉而采用了多層感知器(MLP)的編碼器-解碼器架構。雖然設計簡潔,但TiDE能有效捕捉時間序列的非線性依賴關系,并能很好地處理動態協變量和靜態屬性數據,展現出令人驚艷的預測性能。
在多個公開基準數據集的實驗中,TiDE不僅精度超越了當前最優模型,而且在推理速度和訓練效率上也領先于Transformer模型5-10倍以上。這種簡單高效的特點使TiDE非常適合應用于工業級的大規模部署場景。
如果您對TiDE模型的原理和細節有進一步的了解興趣,我們強烈推薦大家閱讀原論文(https://arxiv.org/pdf/2304.08424.pdf)。希望TiDE這一創新預測模型能為時間序列分析領域注入新的活力,為解決實際問題提供更多的可能性。
探索 TiDE
TiDE 這個名字看似生澀,其實就是" Time-series Dense Encoder "的英文縮寫。它的設計思路非常巧妙,摒棄了目前流行的轉換器(Transformer)結構,而是采用了編碼器-解碼器的框架,使用簡單的多層感知器(MLP)網絡來完成編碼和解碼的工作。
那它是如何工作的呢?首先,編碼器會將歷史的時間序列數據和相關的協變量(如節假日、促銷活動等)輸入進去,學習一個緊湊的表示向量,捕捉數據的內在模式。接下來,解碼器會根據這個向量,結合已知的未來時間步的協變量,生成相應的預測值。
TiDE的巧妙之處在于,它利用MLP的非線性映射能力來提取復雜特征,同時避免了轉換器的注意力計算,大幅提高了模型的訓練和預測速度。事實上,在多個公開數據集的測試中,TiDE不僅精度超過了現有最佳模型,其運算效率甚至比基于轉換器的模型快了5-10倍之多!
這種高效而精準的特性,使得TiDE十分適合工業級的大規模部署場景。如果你對時間序列預測有研究興趣,不防一探 TiDE 模型的奧秘。
TiDE 的結構
TiDE 的架構如下圖所示。
TiDE 的結構
從上圖我們可以看出,該模型將每個序列視為一個獨立通道,即每次只傳遞一個序列及其協變量。
我們還可以看到,該模型有三個主要組成部分:編碼器、解碼器和時序解碼器,它們都依賴于殘差塊結構。
這張圖包含了很多信息,讓我們來更詳細地探討每個組件。
探索殘差塊
如前所述,殘差塊是 TiDE 架構的基礎層。
殘差塊的組成
從上圖中,我們可以看到這是一個具有一個隱藏層和 ReLU 激活的 MLP。然后是一個剔除層、一個跳轉連接和最后的層歸一化步驟。
然后,這個組件會在整個網絡中重復使用,以進行編碼、解碼和預測。
了解編碼器
在這一步中,模型會將時間序列的過去和協變因素映射到一個密集的表示中。
第一步是進行特征投影。這就是利用殘差塊將動態協變量(隨時間變化的外生變量)映射到低維投影中。
請記住,在進行多元預測時,我們需要特征的未來值。因此,模型必須處理回望窗口和水平序列。
這些序列可能會很長,因此,通過向低維空間投影,我們可以保持長度可控,并允許模型處理更長的序列,包括歷史窗口和預測范圍。
第二步是將序列的過去與其屬性以及過去和未來協變量的投影連接起來。然后將其發送給編碼器,編碼器就是一疊殘差塊。
因此,編碼器負責學習輸入的表示。這可以看作是一種學習嵌入。
完成后,嵌入將被發送到解碼器。
了解解碼器
在這里,解碼器負責接收編碼器的學習表示并生成預測。
第一步是密集解碼器,它也是由一疊殘差塊組成。它獲取編碼信息并輸出一個矩陣,然后輸入時序解碼器。
解碼輸出與預測特征堆疊,以捕捉未來協變量的直接影響。例如,節假日是準時事件,會對某些時間序列產生重要影響。有了這種殘差聯系,模型就能捕捉并利用這些信息。
第二步是時空解碼器,在此生成預測結果。在這里,它只是一個輸出大小為 1 的殘差塊,這樣我們就能得到給定時間序列的預測結果。
現在,我們已經了解了 TiDE 的每個關鍵組成部分,讓我們用 Python 將其應用到一個小型預測項目中。
使用 TiDE 進行預測
現在,讓我們在一個小型預測項目中應用 TiDE,并將其性能與 TSMixer 進行比較。
有趣的是,TSMixer 也是谷歌研究人員開發的基于 MLP 的多元預測架構,但它比 TiDE 早一個月發布。因此,我認為在一個小實驗中比較這兩種模型是很有趣的。
Etth1 數據集: https://github.com/zhouhaoyi/ETDataset。
這是文獻中廣泛使用的時間序列預測基準。它與其他協變量一起跟蹤電力變壓器的每小時油溫,是進行多元預測的絕佳場景。
導入庫并讀取數據
第一步自然是導入項目所需的庫并讀取數據。
雖然 TiDE 原始論文的源代碼在 上公開,但我還是選擇使用 Darts 中的實現。
GitHub: https://github.com/google-research/google-research/tree/master/tide)
它將為我們提供更大的靈活性,而且它還帶有超參數優化功能,而這些功能在原始代碼庫中是沒有的。
導入 darts 以及其他標準軟件包。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from darts import TimeSeries
from darts.datasets import ETTh1Dataset
然后,我們就可以讀取數據了。Darts 提供了學術界常用的標準數據集,比如 Etth1 數據集。
series = ETTh1Dataset().load()
拆分數據,將最后 96 個時間步驟保留給測試集。
train, test = series[:-96], series[-96:]
訓練 TiDE
要訪問 TiDE,只需從 darts 庫中導入它。在訓練之前,還需要手動縮放數據。這樣可以確保訓練過程更快、更穩定。
from darts.models.forecasting.tide_model import TiDEModel
from darts.dataprocessing.transformers import Scaler
train_scaler = Scaler()
scaled_train = train_scaler.fit_transform(train)
然后,初始化模型并指定其參數。在這里,我使用的優化參數與論文中針對該特定數據集介紹的參數相同。
tide = TiDEModel(
input_chunk_length=720,
output_chunk_length=96,
num_encoder_layers=2,
num_decoder_layers=2,
decoder_output_dim=32,
hidden_size=512,
temporal_decoder_hidden=16,
use_layer_norm=True,
dropout=0.5,
random_state=42)
然后,就可以簡單地訓練30 個epochs擬合模型了。
tide.fit(
scaled_train,
epochs=30
)
一旦模型完成訓練,我們就可以訪問其預測結果。請注意,由于我們對訓練數據進行了縮放,因此模型也會輸出縮放的預測結果。因此,我們必須反向轉換。
scaled_pred_tide = tide.predict(n=96)
pred_tide = train_scaler.inverse_transform(scaled_pred_tide)
完美!然后,我們就可以評估 TiDE 的性能了。
評估性能
為了評估模型的性能,我們將預測值和實際值存儲在一個 DataFrame 中。
preds_df = pred_tide.pd_dataframe()
test_df = test.pd_dataframe()
我們還可以選擇將預測結果可視化。為了簡單起見,我只繪制了四列。
cols_to_plot = ['OT', 'HULL', 'MUFL', 'MULL']
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12,8))
for i, ax in enumerate(axes.flatten()):
col = cols_to_plot[i]
ax.plot(test_df[col], label='Actual', ls='-', color='blue')
ax.plot(preds_df[col], label='TiDE', ls='--', color='green')
ax.legend(loc='best')
ax.set_xlabel('Date')
ax.set_title(col)
plt.tight_layout()
fig.autofmt_xdate()
可視化 TiDE 預測
從上圖中我們可以看出,TiDE 對每個序列的預測都相當出色。
當然,評估性能的最佳方法是計算誤差指標,因此我們來計算一下平均絕對誤差(MAE)和平均平方誤差(MSE)。
from darts.metrics import mae, mse
tide_mae = mae(test, pred_tide)
tide_mse = mse(test, pred_tide)
print(tide_mae, tide_mse)
由此得出 MAE 為 1.19,MSE 為 3.58。
目前,還沒有現成的實現方法,因此我們必須手動完成許多步驟。
現在,我們只報告 TSMixer 在 Etth1 數據集上對 96 個時間步長進行多元預測的性能。
圖片
TiDE 和 TSMixer 對 Etth1 數據集在 96 個時間步長范圍內進行多元預測的性能指標。我們可以看到,TiDE 的性能最好。
我們使用了一個名為Etth1的標準數據集,在96個時間步長的范圍內進行評估。結果顯示,在這個數據集上,TiDE模型的平均絕對誤差(MAE)和均方誤差(MSE)都比TSMixer更低,這意味著TiDE在預測精度上表現更優秀。
當然,這只是一個有限的實驗案例,并不能完全說明TiDE在任何情況下都會勝過TSMixer。事實上,TiDE可能是對TSMixer的一種漸進式改進。因此,對于每個具體的應用場景,我們都應當分別評估并選擇最適合的模型。
總的來說,時間序列預測是一個錯綜復雜的領域,沒有放之四海而皆準的萬能模型。選擇合適的模型需要結合具體數據和應用場景,并進行反復試驗和調優。我們應該保持開放和客觀的態度,虛心學習不同模型的優缺點,努力尋找最佳實踐。
寫在最后
TiDE(Time-series Dense Encoder)是一種用于時間序列預測的機器學習模型。它的全稱是時間序列密集編碼器,是一種基于多層感知機(MLP)結構的模型,專門設計用于處理多變量、長期的時間序列預測問題。
TiDE模型的工作原理是,首先利用殘差模塊對協變量(影響預測目標的其他相關變量)和歷史數據進行編碼,將它們映射到一個內部表示空間中。然后,模型會對這個學習到的內部表示進行解碼,從而生成對未來時間步的預測值。
由于TiDE模型結構僅包含全連接層,因此相比循環神經網絡等復雜模型,它的訓練時間更短。但即便如此,在長期多步預測任務中,TiDE仍能取得很高的預測性能。
不過,針對不同的預測問題,模型的表現也會有所差異。因此,在實際應用中,建議對TiDE以及其他潛在的模型方案進行評估和測試,選擇最佳的方案。