TimesFM 初學者指南:用 Google 的時間序列模型預測未來!
哈囉,大家好!今天要來介紹一個超酷的東西,叫做 TimesFM (Time Series Foundation Model)。 簡單來說,這是一個由 Google Research 開發的 時間序列預測模型,就像天氣預報一樣,可以預測股票價格、銷售量,甚至電力消耗等等。 聽起來很厲害吧?別擔心,即使你對機器學習還不太熟,看完這篇文章也能初步了解 TimesFM 的核心概念,並開始嘗試!
什麼是時間序列預測?
首先,我們先來釐清一下什麼是時間序列預測。時間序列 (Time series) 指的是一組按照時間順序排列的數據。舉例來說:
- 每日的股價:每天收盤後的股價變化。
- 每小時的用電量:每小時記錄的用電量數據。
- 每月的銷售額:每月統計的銷售額總和。
時間序列預測 (Time series forecasting) 呢,就是利用這些歷史數據,來預測未來一段時間內的數值。例如,根據過去一年的銷售額,預測下個月的銷售額會是多少。
TimesFM 的厲害之處
TimesFM 的厲害之處在哪裡呢?它有幾個關鍵的優點:
- 預訓練模型 (Pretrained Model):TimesFM 是一個預先訓練好的模型。 這表示,它已經在大量的時間序列數據上學習過, 掌握了時間序列數據的模式和規律。 這就像你不用從頭開始學英文,而是直接拿一本已經寫好的英文小說來讀, 就能更快地掌握語法和詞彙。
- Decoder-only 架構:TimesFM 採用的是 decoder-only 的架構。 簡而言之,就是模型專注於 “解碼” 過去的資訊,預測未來的結果。
- 多功能性:TimesFM 可以處理各種不同類型和長度的時間序列數據, 並且提供點預測 (point forecast) 和分位數預測 (quantile forecast) 。 點預測就是預測單一的數值, 例如預測下個月的銷售額是 100 萬。 分位數預測則可以提供預測範圍, 例如預測下個月的銷售額有 80% 的機率落在 90 萬到 110 萬之間。 這可以幫助我們更好地理解預測的不確定性。
- 不斷更新:Google Research 持續更新 TimesFM, 包含模型版本、支援的功能等等。 像最新的 TimesFM 2.5 版本, 提供了更長的上下文長度 (context length) 和更豐富的功能。
快速上手 TimesFM:初學者指南
現在,讓我們開始動手試試看吧!以下是一些簡單的步驟,讓你快速上手 TimesFM:
1. 準備環境
首先,你需要準備 Python 開發環境,並安裝相關的套件。 這裡我們使用 uv 來建立虛擬環境,並安裝套件。
- 安裝必要工具:
- 確保你已經安裝了 Python。
- 安裝
uv: 你可以依照uv的官方指示安裝 (通常使用pip install uv)。
- 建立虛擬環境: 在終端機 (terminal) 中,進入你想要存放專案的資料夾,然後執行:
uv venv這會建立一個虛擬環境,讓你的專案與其他 Python 環境隔離,避免套件衝突。
-
啟用虛擬環境:
source .venv/bin/activate這會啟動虛擬環境。你會看到終端機提示符號前面出現
(.venv),表示你目前正在虛擬環境中。 -
安裝 TimesFM:
git clone https://github.com/google-research/timesfm.git cd timesfm uv pip install -e .[torch] # 或 .[flax] 或 .[xreg],依照你的需求選擇git clone下載 TimesFM 的程式碼。cd timesfm進入程式碼資料夾。uv pip install -e .[torch]安裝 TimesFM 以及 PyTorch 相關的套件。 如果你想要使用 Flax,可以把torch換成flax。 如果你需要 XReg 的支援, 則使用xreg。 選擇torch是一個好的開始,因為 PyTorch 比較容易上手。
- (可選)安裝 PyTorch 或 JAX: 依照你的作業系統和硬體加速器(CPU、GPU、TPU 或 Apple Silicon)的選擇, 安裝 PyTorch 或 JAX。 如果你的電腦有 NVIDIA GPU,建議安裝支援 CUDA 的 PyTorch, 這樣可以加速模型的訓練和預測。 請參考 PyTorch 官方網站 或 JAX 官方網站 上的安裝說明。
2. 撰寫程式碼
接下來,讓我們用 Python 寫一些程式碼來使用 TimesFM。 這裡提供一個簡單的範例:
import torch
import numpy as np
import timesfm
# 設定 PyTorch 預設的浮點數運算精度
torch.set_float32_matmul_precision("high")
# 載入 TimesFM 模型
model = timesfm.TimesFM_2p5_200M_torch.from_pretrained("google/timesfm-2.5-200m-pytorch")
# 設定預測的參數
model.compile(
timesfm.ForecastConfig(
max_context=1024,
max_horizon=12, # 預測未來 12 個時間點
normalize_inputs=True, # 歸一化輸入數據
use_continuous_quantile_head=True, # 使用分位數預測
force_flip_invariance=True,
infer_is_positive=True,
fix_quantile_crossing=True,
)
)
# 準備輸入數據
# 這裡使用兩個虛擬的輸入,你可以替換成你自己的時間序列數據
inputs = [
np.linspace(0, 1, 100), # 第一個輸入:從 0 到 1 的線性數列,長度為 100
np.sin(np.linspace(0, 20, 67)), # 第二個輸入:正弦函數,長度為 67
]
# 進行預測
point_forecast, quantile_forecast = model.forecast(
horizon=12, # 預測未來 12 個時間點
inputs=inputs, # 輸入數據
)
# 輸出預測結果的形狀 (shape)
print("點預測的形狀:", point_forecast.shape) # 預測結果的形狀 (2, 12)
print("分位數預測的形狀:", quantile_forecast.shape) # 分位數預測的形狀 (2, 12, 10)
程式碼說明:
import導入套件: 匯入必要的套件,包括torch(PyTorch),numpy(數值計算),和timesfm。torch.set_float32_matmul_precision("high"): 設置 PyTorch 的運算精度, 可以提高運算效率。model = timesfm.TimesFM_2p5_200M_torch.from_pretrained("google/timesfm-2.5-200m-pytorch"): 載入 TimesFM 2.5 版本的模型, 200M 代表模型的參數數量。model.compile(): 設定預測的相關參數,例如max_context(上下文長度,輸入數據的長度),max_horizon(預測的長度,預測多少個時間點),normalize_inputs(是否歸一化輸入數據) 等等。inputs: 準備輸入數據。 範例程式碼使用兩個虛擬的輸入數據, 你可以替換成你自己的時間序列數據。 輸入數據需要是 NumPy 的 array。model.forecast(): 進行預測, 預測結果包含point_forecast(點預測) 和quantile_forecast(分位數預測)。print(): 印出預測結果的形狀, 方便你了解預測結果的結構。
3. 執行程式碼
在你的終端機中,執行 Python 程式碼:
python 你的程式碼檔名.py
如果你沒有遇到錯誤,你會看到程式碼輸出了預測結果的形狀。 恭喜你,你已經成功使用了 TimesFM 進行時間序列預測了!
深入了解 TimesFM 的核心概念
雖然上面的程式碼範例已經讓你體驗了 TimesFM 的基本用法, 但要更有效地使用它, 還是需要了解一些核心概念:
- 上下文 (Context) 和預測長度 (Horizon):
- 上下文 (Context): 模型在預測時會參考的歷史數據長度。 就像你讀小說一樣, 需要先讀一段時間的劇情, 才能預測接下來會發生什麼。 在範例中,
max_context=1024表示模型會參考長度為 1024 的歷史數據。 - 預測長度 (Horizon): 你希望模型預測的時間點數量。 在範例中,
horizon=12表示模型會預測未來 12 個時間點的數值。
- 上下文 (Context): 模型在預測時會參考的歷史數據長度。 就像你讀小說一樣, 需要先讀一段時間的劇情, 才能預測接下來會發生什麼。 在範例中,
- 輸入數據 (Inputs):
- TimesFM 接受多個輸入。 這些輸入可以包含你想要預測的時間序列數據, 也可以包含其他相關的資訊, 稱為 協變量 (Covariates)。 例如,如果你想預測每月的銷售額, 輸入數據可以包含過去幾個月的銷售額, 以及當月的廣告支出、促銷活動等。
- 輸入數據需要是 NumPy 的 array。
- 預測類型:
- 點預測 (Point Forecast): 預測單一數值。 例如,預測下個月的銷售額是 100 萬。
- 分位數預測 (Quantile Forecast): 預測一個數值範圍, 並提供不同分位數的預測結果。 例如, 預測下個月的銷售額有 80% 的機率落在 90 萬到 110 萬之間。 這可以幫助你了解預測的不確定性。 範例程式碼中
use_continuous_quantile_head=True表示使用分位數預測。
- 模型參數:
- 在
model.compile()中, 你可以調整許多參數來控制預測的行為, 例如是否歸一化輸入數據, 是否使用分位數預測等等。 - 歸一化 (Normalization):
normalize_inputs=True會將輸入數據進行歸一化, 將其縮放到一定的範圍內, 幫助模型更好地學習。
- 在
錯誤排除指南
在使用 TimesFM 時,你可能會遇到一些問題。 以下是一些常見問題的解決方案:
- 套件安裝錯誤: 如果遇到
ModuleNotFoundError錯誤, 可能是你沒有正確安裝套件。 請檢查你是否在正確的虛擬環境中, 並且確認你已經安裝了timesfm以及其他必要的套件 (例如torch或flax)。 你可以再次執行安裝指令來確認:
bash
uv pip install -e .[torch] # 或 .[flax] 或 .[xreg] - 記憶體不足: 如果你的電腦記憶體不足, 可能會遇到錯誤。 你可以嘗試減少上下文長度 (
max_context) 和預測長度 (max_horizon), 或者使用更小的模型版本。 像是TimesFM_2p5_200M_torch的模型參數比較少, 佔用的記憶體也相對較少。 - 輸入數據格式錯誤: 確保你的輸入數據是 NumPy 的 array, 并且符合 TimesFM 要求的格式。
- 模型載入錯誤: 確認你使用的模型名稱 (
"google/timesfm-2.5-200m-pytorch") 是正確的。 你可以在 Hugging Face 網站上找到可用的模型列表。 - GPU 設定問題: 如果你使用 GPU 進行加速, 並且遇到問題, 請確認你已經正確安裝了 PyTorch 或 JAX 的 GPU 版本, 並且你的 GPU 驅動程式是最新的。 你也可以在程式碼中加入以下程式碼來確認 PyTorch 是否可以使用 GPU:
import torch if torch.cuda.is_available(): print("CUDA is available!") device = torch.device("cuda") else: print("CUDA is not available.") device = torch.device("cpu")
個人實作心得
我個人在使用 TimesFM 的過程中, 發現它非常容易上手, 而且預測效果也相當不錯。 以下是我的一些心得:
- 實驗不同的參數組合: 不要害怕嘗試不同的參數組合。
max_context、max_horizon、normalize_inputs等等, 不同的參數設定會影響預測的結果。 通過實驗, 你可以找到最適合你數據的參數組合。 - 資料預處理很重要: 在將數據輸入到 TimesFM 之前, 進行適當的預處理非常重要。 例如, 處理缺失值, 歸一化數據等等。 良好的資料預處理可以提高預測的準確性。
- 結合其他工具: 你可以將 TimesFM 與其他機器學習工具結合使用。 例如, 可以使用 Pandas 進行資料處理, 使用 Matplotlib 或 Seaborn 進行視覺化分析。
- 持續學習: 時間序列預測是一個不斷學習的過程。 持續閱讀相關的論文和技術文章, 了解最新的研究進展, 可以幫助你更好地使用 TimesFM 和其他模型。
結論
TimesFM 是一個非常強大且易於使用的时间序列預測模型, 即使你是一個初學者, 也可以快速上手。 希望這篇文章能夠幫助你了解 TimesFM 的基本概念和使用方法。 現在就開始嘗試, 探索時間序列預測的奧秘吧! 祝你預測成功!
參考資料:
參考閱讀
https://github.comundefined