TimesFM 模型作為一種根據解碼器架構的基礎模型,旨在實作通用的零樣本預測。其核心概念是利用 patching 技術處理時間序列資料,並藉由調整輸入輸出 patch 長度、模型層數和維度等引數來最佳化預測效能。在實際應用中,需考量 batch size、歷史資料長度和預測長度等因素,並可結合共變數提升預測準確度。透過比較原始預測、結合共變數預測和普通最小二乘法預測結果,可以發現共變數能顯著降低 MSE、RMSE 和 MAPE 等誤差指標,並提升 r² 和 adjusted r² 等指標。這凸顯了共變數在時序預測中的重要性。此外,模型的後端選擇也會影響預測效率和效能。TimesFM 模型的應用不限於單一領域,其靈活性和強大的功能使其適用於各種複雜時間序列問題。然而,在實際應用中,仍需考量傳統方法的適用性,並根據實際情況選擇最佳模型。

時序預測:利用 TimesFM 模型進行預測

時序預測(Time Series Forecasting)是機器學習領域中的一個重要課題,特別是在經濟、金融、天氣預測等領域。TimesFM(Time Series Forecasting Model)是一個根據解碼器架構的基礎模型,旨在進行通用的零樣本預測。以下是玄貓對 TimesFM 模型的詳細分析與實作案例。

模型架構與引數設定

TimesFM 模型採用解碼器架構,並透過 patching 技術來處理時間序列資料。這種設計使得模型能夠更好地捕捉時間序列中的長期依賴性。以下是 TimesFM 模型的一些關鍵引數:

  • input_patch_len: 輸入 patch 的長度,這裡設為 32。
  • output_patch_len: 輸出 patch 的長度,這裡設為 128。
  • num_layers: 模型的層數,這裡設為 20 層。
  • model_dims: 模型的維度,這裡設為 1280。
  • backend: 模型的後端,這裡使用 timesfm_backend
input_patch_len = 32
output_patch_len = 128
num_layers = 20
model_dims = 1280
backend = timesfm_backend

model.load_from_checkpoint(repo_id="google/timesfm-1.0-200m")

內容解密:

  • input_patch_lenoutput_patch_len 用於定義輸入和輸出的 patch 長度,這對於模型的訓練和預測效能有著重要影響。
  • num_layersmodel_dims 用於定義模型的深度和寬度,這些引數決定了模型的表達能力和計算複雜度。
  • backend 用於指定模型的運算後端,這裡選擇了專門針對 TimesFM 模型最佳化的後端。

資料準備與預測流程

在進行預測之前,需要準備好資料並設定相關引數。以下是資料準備與預測流程的詳細說明:

batch_size = 128
context_len = 120
horizon_len = 24
input_data = get_batched_data_fn(batch_size=128)
metrics = defaultdict(list)
import time

for i, example in enumerate(input_data()):
    raw_forecast, _ = model.forecast(
        inputs=example["inputs"], freq=[0] * len(example["inputs"])
    )
    start_time = time.time()
    cov_forecast, ols_forecast = model.forecast_with_covariates(
        inputs=example["inputs"],
        dynamic_numerical_covariates={
            "gen_forecast": example["gen_forecast"],
        },
        dynamic_categorical_covariates={
            "week_day": example["week_day"],
        },
        static_numerical_covariates={},
        static_categorical_covariates={
            "country": example["country"]
        },
        freq=[0] * len(example["inputs"]),
        xreg_mode="xreg + timesfm",
        ridge=0.0,
        force_on_cpu=False,
        normalize_xreg_target_per_input=True,
    )
    print(
        f"\rFinished batch {i} linear in {time.time() - start_time} seconds",
        end="",
    )

內容解密:

  • batch_sizecontext_lenhorizon_len 用於定義資料批次大小、歷史資料長度和預測長度。
  • get_batched_data_fn 用於生成批次資料。
  • 在預測過程中,模型首先進行原始預測(raw_forecast),然後結合共變數進行預測(cov_forecastols_forecast)。

結果分析

在完成預測後,可以透過計算誤差指標來評估模型的效能。以下是不同情況下的結果分析:

無共變數的情況

print("Without covariates: \n")
calculate_error_metrics(raw_forecast[:, :horizon_len], example["outputs"])

# 結果
MSE : 404.6088033992598
RMSE : 20.114890091652498
MAPE : 0.18969476358665338
r2 : -0.04918699445529159
adjusted_r2 : -0.07199540737823273

有共變數的情況

print('With covariates: \n')
calculate_error_metrics(cov_forecast, example["outputs"])

# 結果
MSE : 259.9858694585536
RMSE : 16.124077321154026
MAPE : 0.15689309439567115
r2 : 0.16291603857224796
adjusted_r2 : 0.14471856114990556

與普通最小二乘法比較

print('ols forecast: \n')
calculate_error_metrics(ols_forecast, example["outputs"])

# 結果
MSE : 3222.492537935656
RMSE : 56.767002192608835
MAPE : 477.1218213465076
r^2 : -9241.742381331851
adjusted_r^2 : -9442.671563534717

分析結果

從結果可以看出,結合共變數進行預測時,模型的效能有顯著提升。MSE、RMSE 和 MAPE 值都有所降低,而 r^² 和 adjusted r^² 值則有所提高。這表明共變數在時序預測中起到了重要作用。

快速回顧技術選型與應用考量

在技術選型上,TimesFM 提供了靈活且強大的功能。透過不同層級的自訂化與調整,玄貓認為其適用於各種複雜時間序列問題。然而也要注意傳統方法在某些情境下可能會表現更佳。因此建議先嘗試傳統模型後再進一步驗證 TimesFM 的效果。

未來趨勢與展望

玄貓認為未來會有更多基礎模型如 Tiny Time Mixtures、MOMENT、MambaTS、Lag-Llama 和 timer-base-84m 出現,進一步推動時序預測技術發展。希望大家能夠從中受益並進一步探索應用。

如果你有任何問題或需要進一步探討某個特定主題,歡迎留言或聯絡玄貓!

通用預測模型與挑戰

時間序列預測是一個充滿挑戰且多樣化的領域,特別是在面對零樣本(zero-shot)預測時。零樣本時間序列預測模型旨在直接預測未見過的時間序列資料,這對於多變數時間序列分析來說,具有極高的實用價值。然而,這種模型也面臨著資料稀缺、特徵提取困難以及模型過擬合等問題。

零樣本時間序列預測的挑戰

零樣本時間序列預測是一種複雜且具挑戰性的任務,因為它需要在沒有任何訓練資料的情況下,直接進行未來數值的預測。這種情況下,模型需要具備高度的泛化能力和靈活性,才能應對各種未知的時間序列資料。

  1. 資料稀缺:在實際應用中,經常會遇到資料量不足或缺乏標記資料的情況。這使得傳統的盡力學習方法難以有效運作。
  2. 特徵提取困難:時間序列資料中的特徵往往隱含在複雜的時變關係中,需靠高效的特徵提取技術來揭示其內在規律。
  3. 模型過擬合:由於零樣本預測模型需要在沒有訓練資料的情況下執行,因此容易受到輸入資料中的噪聲影響,導致模型過擬合問題。

模型評估指標

在評估零樣本時間序列預測模型時,均方絕對誤差(Mean Absolute Error, MAE)是常用的一個評估指標。MAE能夠反映出預測值與真實值之間的平均絕對誤差程度。此外,均方根誤差(Root Mean Squared Error, RMSE)和R平方(R²)等指標也常被使用來衡量模型效能。

多層感知機(Multilayer Perceptron, MLP)

多層感知機是一種根據前饋神經網路的簡單且有效的人工神經網路架構。MLP通常由多個隱藏層組成,每一層都包含多個神經元。這些神經元透過權重連線來處理輸入資料並產生輸出。

import torch
import torch.nn as nn

class SimpleMLP(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(SimpleMLP, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        out = self.fc1(x)
        out = self.relu(out)
        out = self.fc2(out)
        return out

#### 內容解密:
這段程式碼定義了一個簡單的多層感知機(MLP),該模型包含一個輸入層、一個隱藏層和一個輸出層。每一層之間使用ReLU啟用函式進行非線性轉換。
- `input_size`:輸入層的維度
- `hidden_size`:隱藏層的維度
- `output_size`:輸出層的維度
- `fc1` 和 `fc2`:全連線層(Linear layer)
- `relu`:ReLU啟用函式
- `forward` 方法:定義前向傳播過程

### MOIRAI 模型

Masked EncOder based UnIveRsAl Time Series Forecasting Transformer(MOIRAI)是一種根據Transformer架構的時間序列預測模型。MOIRAI 透過採用遮蔽編碼器技術來提升時間序列預測的準確性和泛化能力。

### 時間序列分析與前沿技術

時間序列分析是資料科學和機器學習中的一個重要領域,應用範圍廣泛,從金融市場預測到氣象資料分析。前沿技術如Transformer、RNN等神經網路架構為時間序列分析帶來了新的突破。

### 自然語言處理與其應用

自然語言處理(NLP)在近年來取得了顯著進展,這些進展也為時間序列分析帶來了啟發。例如,Recurrent Neural Networks(RNNs)和Transformers等架構原本用於處理語言資料,現已成功應用於時間序列資料中的長期依賴關係建模。

```python
import torch
import torch.nn as nn
import torch.optim as optim

class SimpleRNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(SimpleRNN, self).__init__()
        self.hidden_size = hidden_size
        self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        h0 = torch.zeros(1, x.size(0), self.hidden_size).to(x.device)
        out, _ = self.rnn(x, h0)
        out = self.fc(out[:, -1, :])
        return out

#### 內容解密:
這段程式碼定義了一個簡單的迴圈神經網路(RNN)模型。
- `input_size`:輸入向量的維度
- `hidden_size`:隱藏狀態向量的維度
- `output_size`:輸出向量的維度
- `rnn`:RNN層
- `fc`:全連線層(Linear layer)
- `forward` 方法:定義前向傳播過程,其中初始化隱藏狀態並透過RNN層進行計算。

這些技術不僅提升了模型準確性和泛化能力,還為更多複雜且高維度的資料處理提供了新思路。