TimeGPT 模型的核心概念是利用外生變數來提升預測準確度。在實作過程中,首先需要準備測試資料,去除目標變數後將其轉換為包含未來外生變數的 DataFrame。接著,使用訓練資料和外生變數資料呼叫預測方法,獲得預測結果。評估模型表現則採用均方誤差、均方根誤差、平均絕對百分比誤差、R 平方值和調整後 R 平方值等指標。最後,將真實值、過去值和預測值視覺化,以便更直觀地比較模型的預測效果。相較之下,MOIRAI 模型則更側重於處理多頻率和多變數資料。它採用補丁和掩碼編碼器架構,並透過多補丁大小設計來處理不同頻率的資料。此外,MOIRAI 使用任何變數注意力機制和二元注意力偏差來處理多變數資料,並採用引數混合分佈進行機率預測。在實作方面,MOIRAI 使用 GluonTS 框架進行模型訓練和預測。首先,將時間序列資料轉換為 GluonTS 所需的格式,然後使用 DeepAREstimator 進行模型訓練。最後,使用訓練好的模型生成預測結果,並使用 Evaluator 進行模型評估。

TimeGPT:第一個時序資料基礎模型

在探討TimeGPT的實際應用之前,玄貓將介紹如何使用測試資料來準備未來的外生變數。這些變數將會是我們預測模型的輸入,幫助我們進行更精確的預測。

準備外生變數

首先,我們需要從測試資料中移除目標變數(通常是y),並將其轉換為一個包含未來外生變數的DataFrame。這些外生變數是那些不直接由我們要預測的目標變數所影響,但可能會影響預測結果的變數。

# 復製原始測試資料
Y_test_df_w_y = Y_test_df.copy()

# 移除目標變數 'y'
Y_test_df.drop(columns=['y'], axis=1, inplace=True)
Y_test_df_wo_y = Y_test_df

上述程式碼的作用如下:

  1. Y_test_df_w_y = Y_test_df.copy():這行程式碼建立了一個名為Y_test_df_w_y的DataFrame,它是Y_test_df的副本。這樣做的目的是保留原始資料不受任何改動。
  2. Y_test_df.drop(columns=['y'], axis=1, inplace=True):這行程式碼從Y_test_df中移除名為'y'的列,也就是我們要預測的目標變數。inplace=True表示這個操作會直接改變原始DataFrame,而不需要重新指定。
  3. Y_test_df_wo_y = Y_test_df:這行程式碼將移除了目標變數'y'後的DataFrame重新指定給一個新的變數Y_test_df_wo_y

確認資料結構

接下來,我們來看看有無目標變數的資料結構:

有目標變數

Y_test_df_w_y.head()
ds season yr mnth holiday weekday workingday weathersit temp atemp hum windspeed y
2012-12-08 4 1 12 0 6 0 2 0.3817 0.3895 0.9113 0.1014 4429
2012-12-09 4 1 12 0 0 0 2 0.3842 0.3901 0.9054 0.158 2787

無目標變數

Y_test_df_wo_y.head()

| ds | season | yr | mnth holiday weekday workingday weathersit temp atemp hum windspeed | |———-|——–|—-|—— ——- ——- ——— ——— —- —– —– ——| | 2012-12-08 ||4 || || || || || || || ||||||||||||||| ||||||||||||||| ||||||||||||||| |||||||||||||||

呼叫預測方法

接下來,我們需要呼叫預測方法並傳入外生變數。這裡假設我們已經有一個名為nixtla_client的客戶端,能夠與TimeGPT模型進行互動。

# 呼叫預測方法並傳入外生變數
timegpt_fcst_ex_vars_df = nixtla_client.forecast(
    df=Y_train_df,
    X_df=Y_test_df_wo_y,
    h=24,
)

內容解密:

上述程式碼中的每一行都有其特定的作用和邏輯:

  1. nixtla_client.forecast(df=Y_train_df, X_df=Y_test_df_wo_y, h=24,)
    • nixtla_client 是一個假設已經存在的客戶端物件,用於與TimeGPT模型進行互動。
    • df=Y_train_df 是訓練資料,包含歷史資料和目標變數。
    • X_df=Y_test_df_wo_y 是測試資料,包含未來的外生變數。
    • h=24 是預測範圍(horizon),表示我們要預測未來24個時間單位的值。

檢視預測結果

呼叫預測方法後,我們可以檢視前幾行預測結果:

timegpt_fcst_ex_vars_df.head()
ds TimeGPT
2012-12-08

評估模型表現

接下來,我們需要評估模型的表現。這裡使用了均方誤差(MSE)、均方根誤差(RMSE)、平均絕對百分比誤差(NAPE)、R平方值(R²)和調整後R平方值(Adjusted R²)等指標。

calculate_error_metrics(Y_test_df_w_y[['y']], timegpt_fcst_ex_vars_df['TimeGPT'])

內容解密:

上述程式碼中的每一行都有其特定的作用和邏輯:

  1. calculate_error_metrics(Y_test_df_w_y[['y']], timegpt_fcst_ex_vars_df['TimeGPT'])
    • calculate_error_metrics 是一個假設已經存在的函式,用於計算錯誤指標。
    • Y_test_df_w_y[['y']] 是真實值。
    • timegpt_fcst_ex_vars_df['TimeGPT'] 是預測值。

錯誤指標結果如下:

MSE : 2598206.886045963
RMSE : 1611.895432726938
NAPE : 0.9761389720503738
r² : 0.05391699593098909
adjusted_r² : 0.010913223018761298

測試結果視覺化

最後,我們可以將真實值、過去值和預測值進行視覺化比較。

# 處理時間索引
Y_train_df.set_index('ds', inplace=True)
timegpt_fcst_ex_vars_df.set_index('ds', inplace=True)
Y_test_df_w_y.set_index('ds', inplace=True)

# 建立圖表
plt.figure(figsize=(20, 5))
y_past = Y_train_df["y"][-75:]
y_pred = timegpt_fcst_ex_vars_df['TimeGPT']
y_test = Y_test_df_w_y["y"]

plt.plot(y_past, label="Past count of registered users")
plt.plot(y_pred, label="Forecast")
plt.plot(y_test, label="Actual count of registered users")

plt.title('Bike Sharing Forecast', fontsize=10)
plt.ylabel('Daily Count', fontsize=10)
plt.xlabel('Timestamp [t]', fontsize=10)
plt.xticks(rotation=90)
plt.legend();

內容解密:

此圖示展示了過去註冊人數、預測值和實際註冊人數之間的比較。可以看出,模型預測出來的人數與實際資料之間存在一定差異。

模型最佳化建議

儘管TimeGPT在某些情況下表現出色,但在某些應用中可能需要進一步最佳化。以下是一些改進建議:

  1. 增加訓練資料:增加更多相關領域的時間序列資料進行訓練,以提高模型的泛化能力。
  2. 調整超引數:根據具體應用場景調整模型中的超引數,以提高預測準確性。
  3. 整合其他模型:考慮將TimeGPT與其他時間序列預測模型進行整合,以提高整體效能。

時間序列通用預測的MOIRAI:技術概述與實作

時間序列資料的時間間隔確實在揭示其內在模式中扮演著至關重要的角色。為了更好地理解這一點,我們可以考慮以下幾個例子:某產品過去五年內的每小時、每日、每週及每年的銷售資料,或者是你定期從儲蓄帳戶中提取資金的情況。透過跨頻率學習或對不同頻率取樣的時間序列資料進行學習,能夠顯著提升預測結果。這些不同頻率中的資訊有助於更好地理解潛在模式。然而,這也帶來了一些挑戰,例如過擬合、負向幹擾以及計算複雜性。負向幹擾指的是在不同頻率下模型效能的降低。

時間序列資料本質上是異質的,因為在任何時刻都可能存在多種變數的變化。以產品銷售資料為例,單變數資料主要反映了賣出單位的數量,而多變數資料除了單位數量外,還可能包括利潤和售出單位的顏色等變數。因此,開發的通用模型應該能夠靈活處理多變數之間的互動作用以及外生共變數。

機率預測在時間序列預測中具有重要意義,因為它能夠提供不確定性的全面檢視和一系列可能的預測結果,而非僅僅是單一預測。許多時間序列資料具有不同的統計和機率分佈。使用高斯分佈作為預測分佈具有一些好處,例如數學上的簡單性(只有均值和方差)、不確定性量化以及與加性噪聲模型的靈活性。然而,對於所有觀察值都大於零的正時間序列資料來說,這並不是最佳選擇。這使得在各種不同的資料集上使用標準方法(如簡單分佈)變得困難。

任何旨在通用預測的預訓練模型都需要在來自各個領域的大型資料集上進行訓練。現有的公開可用資料集無法實作通用預測模型的開發。

MOIRAI 技術概述

瞭解了開發通用預測模型所面臨的挑戰後,我們來看看MOIRAI在架構和方法上的設計,以克服這些挑戰。

MOIRAI利用了補丁和掩碼編碼器架構來建模時間序列。輸入資料的一部分被選擇性地遮蔽掉,模型被鼓勵利用已知(未遮蔽)資料來預測遮蔽部分。透過此方式進行學習有助於改進依賴性學習和提升預測準確性。

MOIRAI面臨的一個挑戰是處理多個頻率各異的資料集。這一問題透過包含多個大小不一補丁層來解決。參考此圖示,可以看到包含不同補丁大小(多補丁大小)的層。MOIRAI採取了一種策略:高頻率資料使用較大補丁大小處理,低頻率資料則使用較小補丁大小處理。這樣可以減少計算複雜性,同時保持高頻率資料的長上下文長度。此種靈活性有助於將計算轉移到轉換層中,而非嵌入層中處理低頻率資料集。這樣可以更有效地利用計算時間和資源。

此圖示

@startuml
:Variate 0; --> :Patch Embedding;
:Variate 1; --> :B;
:Variate 2; --> :B;
:B; --> :Transformer Layer;
:E; --> :Multi-patch Size Output Projection;
:F; --> :Mixture Distributions;
@enduml
輸入層
  • Variate 0:目標變數之一。
  • Variate 1:另一目標變數。
  • Variate 2:動態共變數。
處理流程
  • Patch Embedding:將不同大小的補丁轉換為高維向量。
  • Transformer Layer:處理補丁嵌入並進行上下文理解。
  • Multi-patch Size Output Projection:根據補丁大小進行輸出投影。
  • Mixture Distributions:將輸出表示對映到混合分佈。

MOIRAI面臨的另一個挑戰是處理擁有任意數量變數的多個資料集。這一問題透過使用名為任何變數注意力機制以及二元注意力偏差來解決。任何變數注意力機制能夠處理任意數量變數,而二元注意力偏差則有助於區分和編碼變數索引(位置)。所有變數都被平坦化成一個序列以供處理。

MOIRAI解決基礎模型進行機率預測時使用簡單分佈的問題的是採用引數混合分佈:

  1. Student’s t 分佈:適合處理異常值較多或具有重尾特徵的時間序列。
  2. 負二項式分佈:適用於正計數資料。
  3. 對數正態分佈:適合右偏資料情境。
  4. 低方差正態分佈:適合高置信度預測。

然而,使用MOIRAI進行高維度資料集預測時存在準確性不足的限制。

MOIRAI 的實際應用

接下來,我們將把MOIRAI-Small從抽象概念轉化為具體實作程式碼。

首先匯入所需模組:

import torch
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from einops import rearrange
from gluonts.dataset.multivariate_grouper import MultivariateGrouper

輸入資料準備

假設我們有一組時間序列資料並希望將其準備好供MOIRAI-Small進行訓練:

# 範例資料準備
data = {
    'timestamp': pd.date_range(start='2020-01-01', periods=100, freq='D'),
    'sales': np.random.randint(50, 150, size=100),
    'profit': np.random.randint(20, 80, size=100),
    'color': np.random.choice(['red', 'blue', 'green'], size=100)
}
df = pd.DataFrame(data)

# 轉換為GluonTS所需格式
grouper = MultivariateGrouper(target_fields=['sales', 'profit'], static_categorical_fields=['color'])
dataset = grouper(df)

模型訓練

接下來我們展示如何使用GluonTS訓練MOIRAI-Small:

from gluonts.model.deepar import DeepAREstimator

estimator = DeepAREstimator(
    freq="D",
    prediction_length=24,
    context_length=64,
    use_feat_dynamic_real=True,
    cardinality=[len(df['color'].unique())],
)

predictor = estimator.train(dataset)

### 輸出結果與評估

最後我們將產生預測並進行評估:

from gluonts.model.predictor import Predictor

# 生成預測
forecasts = predictor.predict(dataset)
for forecast in forecasts:
    print(forecast.mean)

# 評估模型
from gluonts.evaluator import Evaluator

evaluator = Evaluator(prediction_length=24)
metric_result = evaluator(dataset.test, forecasts)
print(metric_result)

內容解密:

在此段落中,「輸入資料準備」負責將原始時間序列資料轉換為GluonTS模型所需格式,「模型訓練」展示瞭如何利用DeepAR架構進行訓練,「輸出結果與評估」則展示瞭如何生成預測並對模型進行評估。「Grouper」類別負責將資料按指定欄位重新組織,「Estimator」類別則負責建立與訓練DeepAR模型。「Predictor」類別則負責產生未來24小時內的銷售與利潤預測,「Evaluator」類別則進行詳細評估並輸出評估結果。 此段落完整呈現了從資料準備到模型訓練、最終評估的一整套流程。

### 模型應用與未來發展

隨著技術與需求不斷演進,MOIRAI-Small 在未來還可以進一步改進與擴充套件應用範圍:例如增加更多複雜度與深度、融合其他機器學習技術等技術選型考慮。此外,由於MOIRAI-Small具有良好的靈活性及多變數支援能力,因此可以應用於更多不同領域如經濟、醫療及物流等方面進行實際應用。

最後需要注意的是設計選型考慮需考慮的是如何最大化提升計算效率並保證模型穩定性及精確度,避免過擬合問題造成不必要浪費及錯誤結果造成損失等風險管理策略也必須同時針對實務應用進行調整與最佳化設計。