使用 🤗 Transformers 進行時間序列 Transformer 機率預測
TL;DR
Hugging Face 推出了 Time Series Transformer,一個原始的編碼器‑解碼器 Transformer,能夠學習單變量序列的全局機率預測,並在 Tourism Monthly 資料集上超越傳統基線。
為何使用全局機率模型?
在許多相關序列上訓練單一模型(全局模型)使網路能捕捉共享的模式與潛在表示,與傳統「局部」方法逐一為每條序列擬合不同。機率預測——預測完整的分佈而非單點估計——提供了不確定性量化,這對後續決策至關重要。
架構概覽
Time Series Transformer 在編碼器‑解碼器配置中重新使用標準 Transformer(Vaswani 等,2017)。
- Encoder 消耗固定大小的過去觀測上下文窗口。
- Decoder 以因果遮罩自回歸方式生成未來值,類似於文字生成。
- Distribution head(預設:Student‑t)為每個預測步驟輸出機率分佈的參數。
主要優勢:
- 透過類似
attention_mask的機制處理缺失值。 - 透過窗口式訓練支援任意的上下文與預測長度。
- 利用與 NLP 模型相同的 API,支援推論時使用
generate()。
模型設定細節
from transformers import TimeSeriesTransformerConfig, TimeSeriesTransformerForPrediction
config = TimeSeriesTransformerConfig(
prediction_length=24, # forecast horizon (months)
context_length=48, # encoder window (2× horizon)
lags_sequence=[1,2,3,4,5,6,7,11,12,13,23,24,25,35,36,37],
num_time_features=2, # month‑of‑year + age feature
num_static_categorical_features=1, # series ID
cardinality=[366], # 366 regions in the dataset
embedding_dimension=[2],
encoder_layers=4,
decoder_layers=4,
d_model=32,
)
model = TimeSeriesTransformerForPrediction(config)
- 模型學習 Student‑t 分佈(
model.config.distribution_output == "student_t")。 - 靜態類別嵌入編碼每條序列的身份,使單一模型能服務全部 366 條序列。
資料管線(GluonTS + 🤗 Datasets)
- 載入 Monash
tourism_monthly資料集(訓練/驗證/測試分割,366 條序列)。 - 將
start時間戳轉換為pandas.Period,以便輕鬆產生時間特徵。 - 定義 GluonTS 轉換鏈,其:
- 移除未使用的靜態/動態欄位。
- 將欄位轉換為 NumPy 陣列。
- 為缺失值加入觀測遮罩。
- 產生時間特徵(
month_of_year)與年齡特徵。 - 堆疊時間特徵並重新命名欄位以符合 Transformer API。
- 建立
InstanceSplitter,為編碼器抽樣大小為context_length + max(lags)的窗口,為解碼器抽樣prediction_length。它支援三種模式:train(隨機窗口)、validation(最後窗口)以及test(僅最後上下文)。 - 建構 DataLoaders,將轉換後的實例批次化為張量(
past_values、past_time_features、future_time_features等)。
訓練迴圈(Accelerate)
from accelerate import Accelerator
from torch.optim import AdamW
accelerator = Accelerator()
model.to(accelerator.device)
optimizer = AdamW(model.parameters(), lr=6e-4, betas=(0.9, 0.95), weight_decay=1e-1)
model, optimizer, train_loader = accelerator.prepare(model, optimizer, train_loader)
model.train()
for epoch in range(40):
for batch in train_loader:
optimizer.zero_grad()
outputs = model(**batch)
accelerator.backward(outputs.loss)
optimizer.step()
- 解碼器會自動平移
future_values以計算似然損失。 - 未執行超參數搜尋;40 個 epoch 已足以取得優異結果。
使用自回歸生成進行推論
model.eval()
forecasts = []
for batch in test_loader:
out = model.generate(**batch)
forecasts.append(out.sequences.cpu().numpy())
forecasts = np.vstack(forecasts) # shape: (366, 100, 24)
generate()從學習到的分佈抽樣,為每條序列產生 100 條 Monte‑Carlo 軌跡。- 取樣本的中位數作為點預測評估。
評估指標
使用 evaluate 套件:
- MASE(Mean Absolute Scaled Error)= 1.256(在 366 條序列上的平均)。
- sMAPE(Symmetric Mean Absolute Percentage Error)= 0.161。 這些數值在相同基準上優於各種傳統與深度基線。
基準比較
| 模型 | MASE |
|---|---|
| SES | 3.306 |
| Theta | 1.649 |
| TBATS | 1.751 |
| ETS | 1.526 |
| (DHR‑)ARIMA | 1.589 |
| PR | 1.678 |
| CatBoost | 1.699 |
| FFNN | 1.582 |
| DeepAR | 1.409 |
| N‑BEATS | 1.574 |
| WaveNet | 1.482 |
| Transformer (this work) | 1.256 |
Transformer 在未進行任何資料集特定調整的情況下取得最低的 MASE,顯示全局注意力機制能有效捕捉季節性與趨勢模式。
實務要點
- 全局機率預測 可透過少量程式碼使用 🤗 Transformers 套件實作。
- 與語言模型相同的 API(
generate、forward、loss)適用於時間序列資料,降低實務門檻。 - 缺失資料處理透過注意力遮罩原生支援,免除填補需求。
- 二次方注意力成本限制上下文長度;未來工作可採用高效注意力變體。
社群未來方向
- 多變量擴充 – 支援對角獨立與全協方差分佈頭。
- 時間序列分類 – 為異常偵測等任務加入分類頭。
- 預訓練檢查點 – 探索在異質時間序列語料庫上大規模預訓練,類似於 NLP/視覺。
- 可選日期時間輸入 – 調整管線以適用缺乏明確時間戳的資料集(例如神經科學錄製)。
- 高效注意力 – 整合稀疏或線性複雜度注意力以擴大可行的上下文窗口。
此發佈證明,原始 Transformer 結合適當的機率頭與資料管線,即可在單變量預測上具競爭力。鼓勵研究人員與工程師嘗試 Hugging Face Hub 上的其他資料集,調整頻率特定參數,並為套件貢獻更多模型。