Chronos 和 TimeGPT 作為時序預測模型,各有其優勢和適用場景。Chronos 偏向單變數資料的機率預測,透過預訓練模型快速生成預測結果,並提供多種誤差指標評估模型準確性。TimeGPT 則根據 Transformer 架構,更適合處理多變數時序資料,其零樣本推理能力使其在缺乏訓練資料的情況下也能表現出色。Python 程式碼範例展示瞭如何使用這兩個模型進行預測、評估和視覺化。模型評估部分涵蓋了 MSE、RMSE、MAPE、R² 和 Adjusted R² 等指標,並搭配圖表展示預測值與真實值的比較,方便讀者理解模型的預測效果。文章也討論了 TimeGPT 在不同領域的應用案例,例如金融、物流和智慧城市管理,並指出其在長期趨勢預測上的挑戰和未來發展方向。透過理解這些模型的特性和應用方法,開發者能更有效地選擇合適的模型解決實際問題。

時序預測模型的深度解析:Chronos與TimeGPT

在現代資料科學中,時序預測是一個關鍵領域,涉及預測未來時間點的資料值。這章節將探討Chronos和TimeGPT這兩個強大的時序預測模型,並透過實際案例來解釋其應用。

Chronos:預訓練機率時序模型

Chronos 是一個預訓練的機率時序模型,專注於單變數時序預測。其核心在於使用大量已知的時序資料進行預訓練,使其能夠在多種情境下進行準確預測。以下是 Chronos 的基本應用流程:

應用流程

首先,我們需要設定預測器並進行預測:

# 設定預測器
predictor = ChronosPredictor()
# 進行預測
predictions = predictor.predict(train_data)
# 檢視預測結果
predictions.head()

這裡的 predictions 結構如下:

              mean    0.1       0.2       0.3       0.4       0.5       0.6       0.7       0.8       0.9
item_id   timestamp
airline_1 1960-01-31   409.051   390.086   396.596   401.291   405.302   409.051   412.800   416.811   421.506   428.016
          ...

模型評估

接著,我們需要計算模型的誤差指標以評估其準確性:

calculate_error_metrics(test_data['target'], predictions['mean']['airline_1'])

結果可能如下:

MSE : 231.549
RMSE : 15.217
NAPE : 0.027
r2 : 0.958
adjusted_r2 : 0.954

結果視覺化

最後,我們可以使用 predictor.plot 函式來視覺化預測結果:

predictor.plot(
    data=Y_df,
    predictions=predictions,
    item_ids=["airline_1"],
    max_history_length=200,
);

此圖示展示了觀察值與預測值之間的對比,顯示出 Chronos 在航空旅客數量預測上的高準確性。

TimeGPT:第一個基礎模型

TimeGPT 是一個生成式預訓練轉換器模型,專為時序資料設計。它能夠處理多種領域的時序資料,包括零售、電力、網路流量、交通、經濟、金融和物聯網。以下是 TimeGPT 的技術概述。

技術概述

TimeGPT 根據轉換器架構,採用編碼器-解碼器設計,每層都包含殘差連線和層正規化。解碼器的輸出透過線性層投影到預測視窗維度。為了增強歷史值視窗的輸入,增加了區域性位置編碼。注意力機制使模型能夠專注於輸入序列中的最相關部分,從而更好地捕捉長期依賴性和複雜模式。

應用範例

以下是一個簡單的 TimeGPT 應用範例:

# 初始化 TimeGPT 模型
model = TimeGPT()

# 準備訓練資料
train_data = prepare_train_data()

# 預測未來值
predictions = model.predict(train_data)

資料視覺化

如同 Chronos,TimeGPT 的結果也可以進行視覺化以便更直觀地理解:

model.plot(
    data=train_data,
    predictions=predictions,
    item_ids=["sample_item"],
    max_history_length=200,
);

此圖示展示了模型在不同情境下的表現,並且能夠幫助我們理解其預測能力。

隨著時間序列分析技術的不斷進步,未來可能會出現更多創新的模型和方法。例如,結合更多外部資料來源或使用先進的深度學習技術來提升預測精確度。此外,多模態時間序列分析也將成為一個新興領域,結合影像、文字和其他形式的資料來進行更全面的時間序列分析。

希望這篇文章能夠幫助讀者更好地理解時間序列分析中的這些技術進展,並激發更多創新應用。

時間序列預測:TimeGPT的應用與實作

在現代資料分析中,時間序列預測是一個至關重要的領域。TimeGPT 是首個專為時間序列預測設計的基礎模型,其設計理念來自於自然語言處理中的 GPT 模型。TimeGPT 透過模仿人類閱讀歷史資料的方式來進行預測,具有出色的零樣本推理能力,能夠在沒有細調的情況下取得優異的預測效果。

TimeGPT 的基本概念

首先,我們來瞭解 TimeGPT 的基本概念。時間序列預測模型可以表示為一個函式 ( f: X \rightarrow Y ),其中 ( X ) 是特徵空間, ( Y ) 是依賴變數。考慮以下設定: ( X = {y_{[0:t]}, x_{[0:t+h]}} ), ( Y = {y_{[t+1:t+h]}} ),這裡 ( h ) 是預測的時間範圍(horizon), ( y ) 是目標變數, ( x ) 是外生變數。TimeGPT 的目標是估計條件分佈 ( P(y_{[t+1:t+h]} | y_{[0:t]}, x_{[0:t+h]}) = f(y_{[0:t]}, x_{[0:t+h]}) )。

此圖示

  graph TD;
    B[B]
    A[觀察歷史資料] --> B{過去與未來特徵};
    B --> C[預測目標變數];
    C --> D[未來時間點];

TimeGPT 的優勢與挑戰

TimeGPT 在零樣本推理方面表現出色,這意味著它在沒有任何細調的情況下就能取得良好的預測效果。然而,當預測時間範圍過長時,其準確性會顯著下降。此外,TimeGPT 的原始論文僅提供了高層次的方法概述,缺乏具體的實施細節。

TimeGPT 的實作

設定 API 金鑰

首先,我們需要設定 API 金鑰來存取 TimeGPT 模型。以下是使用 Nixtla API 的步驟:

  1. 登入到 Nixtla 開發者儀錶板並使用 Gmail、GitHub 或電子郵件進行身份驗證。
  2. 在儀錶板中導航到「API 金鑰」並建立新的 API 金鑰。
  3. 將金鑰直接貼上到 Python 陳述式中。
from nixtla import NixtlaClient

nixtla_client = NixtlaClient(api_key='nixtla-tok-xxxxxxxxxxxx')
nixtla_client.validate_api_key()

單變數時間序列預測

接下來,我們以單變數時間序列為例進行預測。我們將使用 AirPassengersDataset 作為示例資料集。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error, mean_absolute_percentage_error, r2_score

# 載入資料集並進行分割
Y_df = pd.read_csv('AirPassengersDataset.csv')
Y_df.drop(['unique_id'], axis=1, inplace=True)
Y_df = Y_df.reset_index(drop=True)
Y_train_df = Y_df[Y_df.ds <= '1959-12-31']
Y_test_df = Y_df[Y_df.ds > '1959-12-31']

# 進行預測
timegpt_fcst_df = nixtla_client.forecast(df=Y_train_df, h=12, time_col='ds', target_col='y')

內容解密:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error, mean_absolute_percentage_error, r2_score

首先引入所需的 Python 函式庫。numpypandas 用於資料處理和分析,matplotlib 用於視覺化圖形,sklearn.metrics 提供了計算錯誤指標的方法。

# 載入資料集並進行分割
Y_df = pd.read_csv('AirPassengersDataset.csv')
Y_df.drop(['unique_id'], axis=1, inplace=True)
Y_df = Y_df.reset_index(drop=True)

這段程式碼從 CSV 檔案中載入 AirPassengersDataset 資料集。我們移除不必要的欄位 unique_id ,並重置索引以便後續操作。

Y_train_df = Y_df[Y_df.ds <= '1959-12-31']
Y_test_df = Y_df[Y_df.ds > '1959-12-31']

將資料集分割為訓練集和測試集。訓練集包含 1959 年之前的所有資料,測試集包含 1960 年及之後的資料。

# 進行預測
timegpt_fcst_df = nixtla_client.forecast(df=Y_train_df, h=12, time_col='ds', target_col='y')

這段程式碼使用 NixtlaClient 的 forecast 方法對訓練集進行預測,預測未來 12 個月(horizon)的乘客數量。引數 df 是訓練資料集,h 是預測範圍,time_col 是日期欄位名稱,target_col 是目標變數欄位名稱。

評估模型效能

接下來,我們需要評估模型的效能。我們使用均方誤差(MSE)、均方根誤差(RMSE)、平均絕對百分比誤差(MAPE)和決定係數(R²)來評估模型。

def calculate_error_metrics(y_true, y_pred):
    mse = mean_squared_error(y_true, y_pred)
    rmse = np.sqrt(mse)
    mape = mean_absolute_percentage_error(y_true, y_pred)
    r2 = r2_score(y_true, y_pred)
    adjusted_r2 = 1 - (1 - r2) * (len(y_true) - 1) / (len(y_true) - len(y_pred) - 1)
    return mse, rmse, mape, r2, adjusted_r2

mse, rmse, mape, r2, adjusted_r2 = calculate_error_metrics(Y_test_df['y'], timegpt_fcst_df['TimeGPT'])
print(f"MSE: {mse}")
print(f"RMSE: {rmse}")
print(f"MAPE: {mape}")
print(f"R²: {r2}")
print(f"Adjusted R²: {adjusted_r2}")

內容解密:

def calculate_error_metrics(y_true, y_pred):

這段程式碼定義了一個函式 calculate_error_metrics ,用於計算各種錯誤指標。引數 y_true 是真實值,y_pred 是預測值。

mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse)
mape = mean_absolute_percentage_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)
adjusted_r2 = 1 - (1 - r2) * (len(y_true) - 1) / (len(y_true) - len(y_pred) - 1)

這段程式碼計算均方誤差(MSE)、均方根誤差(RMSE)、平均絕對百分比誤差(MAPE)和決定係數(R²),並計算調整後的決定係數(Adjusted R²)。

mse, rmse, mape, r2, adjusted_r2 = calculate_error_metrics(Y_test_df['y'], timegpt_fcst_df['TimeGPT'])

這段程式碼呼叫 calculate_error_metrics 函式,計算模型在測試集上的各項錯誤指標。

print(f"MSE: {mse}")
print(f"RMSE: {rmse}")
print(f"MAPE: {mape}")
print(f"R²: {r2}")
print(f"Adjusted R²: {adjusted_r2}")

最後這段程式碼輸出各項錯誤指標的值。

評估結果視覺化

最後,我們使用 Matplotlib 函式庫將真實值和預測值進行視覺化比較。

plt.figure(figsize=(20, 5))
y_past = Y_train_df["y"][-50:]
y_pred = timegpt_fcst_df['TimeGPT']
y_test = Y_test_df["y"]
plt.plot(y_past, label="過去時間序列值")
plt.plot(timegpt_fcst_df.index[-50:], y_pred[-50:], label="預測")
plt.plot(y_test.index[-50:], y_test[-50:], label="真實時間序列值")
plt.title('乘客數量預測', fontsize=10)
plt.ylabel('每月乘客人數', fontsize=10)
plt.xlabel('時間戳 [t]', fontsize=10)
plt.tight_layout()
plt.xticks(rotation=90)
plt.legend()
plt.show()

內容解密:

plt.figure(figsize=(20, 5))

設定圖形尺寸為寬度 20 英寸、高度 5 英寸。

y_past = Y_train_df["y"][-50:]

從訓練集中提取最後 50 個值作為過去時間序列值。

y_pred = timegpt_fcst_df['TimeGPT']

提取模型對未來時間點的預測值。

y_test = Y_test_df["y"]

提取測試集中的真實值。

plt.plot(y_past, label="過去時間序列值")

繪製過去時間序列值。

plt.plot(timegpt_fcst_df.index[-50:], y_pred[-50:], label="預測")

繪製模型的預測值。

plt.plot(y_test.index[-50:], y_test[-50:], label="真實時間序列值")

繪製真實時間序列值。

plt.title('乘客數量預測', fontsize=10)
plt.ylabel('每月乘客人數', fontsize=10)
plt.xlabel('時間戳 [t]', fontsize=10)

設定圖形標題及軸標籤。

plt.tight_layout()
plt.xticks(rotation=90)
plt.legend()
plt.show()

調整圖形佈局、旋轉 x 軸標籤、顯示圖例並顯示圖形。 這樣可以直觀地看到模型預測結果與真實值之間的差異。

應用案例二:多變數時間序列

接下來我們以多變數為例進行 TimeGPT 的應用。這裡我們選擇的是腳踏車租賃系統的相關資料為範例。

載入多變數資料並進行分割

首先載入資料並清洗資料:

# 載入腳踏車租賃系統資料集並進行清洗與分割
bike_data_path ='Bike_sharing_systems.csv'
bike_dataframe=pd.read_csv(bike_data_path)

bike_dataframe.drop(columns=['instant','casual','cnt'], axis=1,
inplace=True)

bike_dataframe.rename(columns={'dteday':'ds','registered':'y'}, inplace=True)

bike_dataframe.head()

執行 TimeGPT 預測

接下來執行 TimeGPT 預測:

# 執行 TimeGPT 預測並檢視前五筆結果。
bike_timegpt_forecasts=bike_client.forecast(df=bike_dataframe,h=7,
time_col='ds',target_col='y')

bike_timegpt_forecasts.head()

評估多變數模型效能

接著以多變數特徵來評估其模型效能:

評估結果視覺化

最後將上述多變數結果進行視覺化:

TimeGPT 在企業中的應用前景

TimeGPT 的強大零樣本推理能力使其在各種企業應用中具有廣泛前景。例如在金融領域中可以用於股票價格趨勢分析;在物流管理中可以用於需求預測;在智慧城市管理中可以用於交通流量預測等。 儘管如此強大但也需考慮其可能存在長期趨勢不準確問題且需要根據具體情況調整及佈署合適之技術方法以充分發揮其效能。 透過以上內容可以深刻理解如何利用 TimeGPT 在處理及解決更多時空問題中發揮其價值與潛力。