傳統時間序列預測方法在處理小規模或波動較大的資料集時,容易出現過擬合或欠擬合等問題。大語言模型(LLM)的出現為時間序列預測提供了新的解決方案。LLM 擅長捕捉複雜的模式和關係,使其在處理時間序列資料時具有獨特優勢。Time-LLM 技術利用 LLM 中的轉換器/注意力機制來提取時間序列中的潛在結構資訊,並能同時處理多變數資料,提升預測準確性。Chronos 模型則是一種根據 T5 家族語言模型架構的機率性時序訓練模型,它透過縮放和量化將實數時間序列資料轉換為離散的 token,並使用交叉熵損失函式進行訓練。這種方法可以在不改變現有語言模型架構的情況下有效地應用於各種時序問題。在實際應用中,可以使用 AutoGluon 等工具簡化 Chronos 模型的訓練和預測過程。透過資料增強技術,如 TSMixup 和 KeralSynth,可以克服訓練資料不足的挑戰,提升模型的泛化能力。

應用大語言模型進行時間序列預測

時間序列預測的挑戰

在進行時間序列預測時,通常會使用過去的資料來預測未來的趨勢。然而,這樣的預測往往不夠準確,特別是在資料量較小或變動較大的情況下。這是因為大語言模型(LLM)在處理小規模資料集時,容易出現過擬合或欠擬合的問題。此外,這些模型通常過於複雜,無法有效地捕捉到時間序列中的細微變化。

以下程式碼展示瞭如何使用Python進行時間序列的繪圖:

import matplotlib.pyplot as plt

# 假設 y_past, y_pred, y_test 為已經計算好的時間序列資料
y_past = [123, 154, 189, 230]
y_pred = [130, 160, 190, 235]
y_test = [132, 158, 188, 228]

plt.plot(y_past, label="過去時間序列值")
plt.plot(y_pred, label="預測值")
plt.plot(y_test, label="實際時間序列值")
plt.title('航空公司乘客數量預測', fontsize=10)
plt.ylabel('每月乘客數', fontsize=10)
plt.xlabel('時間戳記 [t]', fontsize=10)
plt.legend()
plt.show()

內容解密:

這段程式碼使用了Matplotlib函式庫來繪製三條不同的時間序列資料線:過去的時間序列值、預測值以及實際的時間序列值。這樣的繪圖可以幫助我們直觀地觀察模型預測結果與實際資料之間的差異。以下是程式碼的詳細解說:

  • import matplotlib.pyplot as plt:匯入Matplotlib函式庫,用於繪製圖表。
  • y_past, y_pred, y_test:假設這些變數已經包含了過去的時間序列值、預測值以及實際的時間序列值。
  • plt.plot(y_past, label="過去時間序列值"):繪製過去的時間序列值,並標註為「過去時間序列值」。
  • plt.plot(y_pred, label="預測值"):繪製模型預測的時間序列值,並標註為「預測值」。
  • plt.plot(y_test, label="實際時間序列值"):繪製實際的時間序列值,並標註為「實際時間序列值」。
  • plt.title('航空公司乘客數量預測', fontsize=10):設定圖表標題為「航空公司乘客數量預測」,字型大小為10。
  • plt.ylabel('每月乘客數', fontsize=10):設定Y軸標籤為「每月乘客數」,字型大小為10。
  • plt.xlabel('時間戳記 [t]', fontsize=10):設定X軸標籤為「時間戳記 [t]」,字型大小為10。
  • plt.legend():顯示圖例,方便辨識不同的線條。
  • plt.show():顯示繪製好的圖表。

應用LLM進行時間序列預測

大語言模型(LLM)原本是設計用於自然語言處理(NLP)任務的,但近年來研究人員發現,這些模型也可以應用於時間序列預測。透過修改和調整LLM,我們可以將其用於處理和分析時間序列資料。

Time-LLM技術概述

Time-LLM是一種重新程式設計大語言模型以進行時間序列預測的技術。它利用了LLM中強大的轉換器/注意力機制來捕捉時間序列中的潛在結構資訊(LSI)。以下是Time-LLM的一些關鍵特點:

  • 多變數處理:Time-LLM能夠同時處理多個變數,提升了預測結果的準確性。
  • 強健性:這種方法能夠應對不同規模和特性的資料集,但在小規模資料集上可能會出現過擬合或欠擬合問題。
  • 零樣本學習:Time-LLM具備零樣本學習能力,能夠在未見過的資料集上進行準確預測。

Time-LLM模型架構

以下是Time-LLM模型架構

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

start
:Input Time Series Data;
:Tokenization;
:Transformer/Attention Mechanism;
:Output Prediction;
stop

@enduml

Time-LLM範例程式碼

以下是Time-LLM範例程式碼:

import torch
from transformers import T5Tokenizer, T5ForConditionalGeneration

# 初始化T5 Tokenizer和模型
tokenizer = T5Tokenizer.from_pretrained("t5-small")
model = T5ForConditionalGeneration.from_pretrained("t5-small")

# 假設 time_series_data 是已經準備好的時間序列資料
time_series_data = "123, 154, 189"

# 將時間序列資料轉換為token
input_ids = tokenizer(time_series_data, return_tensors="pt").input_ids

# 生成預測結果
outputs = model.generate(input_ids)
predicted_sequence = tokenizer.decode(outputs[0], skip_special_tokens=True)

print("Predicted sequence:", predicted_sequence)
內容解密:

這段程式碼展示瞭如何使用T5模型進行時間序列預測。以下是程式碼的詳細解說:

  • import torchfrom transformers import T5Tokenizer, T5ForConditionalGeneration:匯入所需的PyTorch和Transformers函式庫。
  • tokenizer = T5Tokenizer.from_pretrained("t5-small"):初始化T5 Tokenizer。
  • model = T5ForConditionalGeneration.from_pretrained("t5-small"):初始化T5模型。
  • time_series_data:假設這個變數已經包含了準備好的時間序列資料。
  • input_ids = tokenizer(time_series_data, return_tensors="pt").input_ids:將時間序列資料轉換為token。
  • outputs = model.generate(input_ids):使用模型生成預測結果。
  • predicted_sequence = tokenizer.decode(outputs[0], skip_special_tokens=True):將生成的token轉換迴文字格式。
  • print("Predicted sequence:", predicted_sequence):輸出預測結果。

Chronos概述

Chronos是一種根據T5家族語言模型架構的機率性時序訓練模型。它利用現有的語言模型架構來處理時序資料,因為語言和時序資料都是連續的。唯一的區別在於,語言是由有限詞彙表中的單片語成,而時序資料則是實數。

Chronos技術概述

Chronos透過簡單地縮放和量化實數來將時序資料分類別成離散bin,然後使用這些bin進行訓練。這種方法可以在不改變現有語言模型架構的情況下有效地應用於各種時序問題。

Chronos圖表

此圖示展示了Chronos如何將縮放和量化後的輸入時順資料轉換為一系列token:

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

start
:Scaled and Quantized 
Input Time Series;
:Input Sequence of Tokens;
:Encoder-Decoder or 
Decoder-only Model;
:Cross Entropy Loss Training;
:Predictive Distribution Sampling;
stop

@enduml

時間系列分詞

在處理時系列分詞之前我們必須將觀察到得資料對映到有限得token集合中。通常透過縮放及量化等手段將實際資料轉換為離散化之token。

時間系列縮放技術

縮放技術主要目的是將資料轉換至適合量化之範圍內,常見得方法有均勻縮放、標準化、最小最大縮放、RobustScaler等。

時間系列量化技術

量化技術主要目的是將實際資料轉換成為離散之bin表示法以適應語言模型之需求。常見得方法有均勻區間分割、階層式分割等。

Chronos訓練技術

Chronos透過分詞化得時順資料進行訓練並最小化交叉熵損失函式以提升其準確度。與傳統之機率式時順預測不同的是Chronos透過分類別得方式對資料進行迴歸。

權重

玄貓認為,利用LLM進行時順預測具有極大潛力但仍需持續研究及最佳化以克服目前存在之挑戰及問題。例如需要解決目前之過擬合及欠擬合問題以及需要提升對於強變動特性之資料集應對能力。未來隨著更多樣且質性更高之資料集持續湧現玄貓相信透過持續研究與最佳化我們將能夠針對各式各樣之情境提供更精確且靈活之解決方案。

時間序列預測模型:Chronos 實戰

時間序列預測模型在多個領域中具有重要應用,從天氣預測到股票市場分析,再到供應鏈管理。Chronos 是一個強大的預訓練機率時間序列模型,能夠準確地預測未來的數值。玄貓將帶領大家深入瞭解 Chronos 的推理過程及其實際應用。

推理過程

Chronos 的推理過程涉及將上下文標記輸入模型,以生成未來的標記。這些標記接著需要映射回真實數值,並進行逆縮放以獲得原始預測。具體來說,這個過程使用了反量化函式來將預測的標記映射回真實數值,然後透過逆縮放轉換來還原原始資料。

然而,訓練這類別模型需要大量的資料,而公共可用的時間序列資料相對稀缺。為了克服這一挑戰,我們可以透過資料增強技術來多樣化訓練資料。例如,使用 TSMixup(時間序列混合增強)技術來生成混合資料,或使用 KeralSynth(根據高斯過程的合成資料生成)來產生合成資料。

Chronos 實戰應用

玄貓將透過具體案例展示 Chronos 的實際應用。我們將使用 AutoGluon 提供的 Chronos-tiny 模型來進行時間序列預測。

使用案例:Chronos-tiny

首先,我們需要匯入必要的模組:

import autogluon
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_percentage_error, r2_score
from autogluon.timeseries import TimeSeriesPredictor, TimeSeriesDataFrame
import pandas as pd

接著,我們使用 Pandas 讀取包含 12 年月度航空乘客資料的 AirPassengersDataset.csv 檔案:

Y_df = pd.read_csv('AirPassengersDataset.csv')
Y_df = Y_df.reset_index(drop=True)
Y_df.head()

AutoGluon 預期時間序列資料為長格式。每一行包含單一觀察值(時間步),並由以下幾個元素表示:

  • item_id:唯一的時間序列 ID(整數或字串)
  • timestamp:觀察值的時間戳(Pandas Timestamp 或相容格式)
  • target:時間序列的數值目標

我們需要將 ds 欄位轉換為日期格式,並重新命名欄位以符合 AutoGluon 的要求:

Y_df['ds'] = pd.to_datetime(Y_df['ds'])
Y_df.rename(columns={"ds": "timestamp", "unique_id": "item_id", "y": "target"}, inplace=True)
Y_df['item_id'] = 'airline_1'

將 DataFrame 轉換為 TimeSeriesDataFrame:

data = TimeSeriesDataFrame.from_data_frame(Y_df, id_column="item_id", timestamp_column="timestamp")
data.tail()

接著,我們將資料分為訓練集和測試集。最後一年的資料用於測試,剩下的 11 年資料用於訓練和預測:

train_data = data.head(132)
test_data = data.tail(12)

建立 TimeSeriesPredictor 物件並指定 Chronos-tiny 模型進行預測:

prediction_length = 12
predictor = TimeSeriesPredictor(prediction_length=prediction_length).fit(train_data, presets="chronos_tiny")

進行預測並檢視結果:

predictions = predictor.predict(train_data)
predictions.head()

內容解密:

在這段程式碼中,我們首先匯入了必要的 Python 模組,包括 AutoGluon 和 Pandas。接著,我們讀取並處理了航空乘客資料集。AutoGluon 預期時間序列資料為長格式,所以我們重新命名了欄位並轉換了日期格式。然後,我們將 DataFrame 轉換為 TimeSeriesDataFrame 並分割成訓練集和測試集。最後,我們建立了一個 TimeSeriesPredictor 物件並使用 Chronos-tiny 模型進行預測。

評估模型精確度

我們可以使用以下公式來評估模型的精確度:

def calculate_error_metrics(actual, predicted):
    mse = mean_squared_error(actual, predicted)
    rmse = np.sqrt(mse)
    mape = mean_absolute_percentage_error(actual, predicted)
    r2 = r2_score(actual, predicted)
    n = len(actual)
    p = len([col for col in predictions.columns if col.startswith('mean')])
    adjusted_r2 = 1 - (1 - r2) * (n - 1) / (n - p - 1)

    return {
        "MSE": mse,
        "RMSE": rmse,
        "MAPE": mape,
        "R2": r2,
        "Adjusted_R2": adjusted_r2
    }

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

內容解密:

在這段程式碼中,我們定義了一個 calculate_error_metrics 函式來計算均方誤差(MSE)、均方根誤差(RMSE)、平均絕對百分比誤差(MAPE)、R² 值和調整後的 R² 值。這些指標有助於我們評估模型的預測精確度。最後,我們使用這些指標評估了 Chronos-tiny 模型在航空乘客資料上的表現。

Chronos 大型集合模型應用

接下來,玄貓將展示如何使用更複雜的 Chronos 大型集合模型來進行時間序列預測。

使用案例:Chronos 大型集合模型

首先,匯入必要的模組:

import autogluon
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_percentage_error, r2_score
from autogluon.timeseries import TimeSeriesPredictor, TimeSeriesDataFrame
import pandas as pd

再次讀取航空乘客資料並處理:

Y_df = pd.read_csv('AirPassengersDataset.csv')
Y_df = Y_df.reset_index(drop=True)
Y_df['ds'] = pd.to_datetime(Y_df['ds'])
Y_df.rename(columns={"ds": "timestamp", "unique_id": "item_id", "y": "target"}, inplace=True)
Y_df['item_id'] = 'airline_1'
data = TimeSeriesDataFrame.from_data_frame(Y_df, id_column="item_id", timestamp_column="timestamp")

分割訓練集和測試集:

train_data = data.head(132)
test_data = data.tail(12)

建立 TimeSeriesPredictor 物件並指定 Chronos 大型集合模型:

prediction_length = 12
predictor = TimeSeriesPredictor(prediction_length=prediction_length).fit(train_data, presets="chronos_large_ensemble")

內容解密:

在這段程式碼中,我們再次匯入了必要的模組並讀取處理了航空乘客資料集。然後,我們分割了訓練集和測試集並建立了一個 TimeSeriesPredictor 物件,使用 Chronos 大型集合模型進行預測。

推論

透過這些具體案例和詳細解說,玄貓展示瞭如何使用 Chronos 模型進行時間序列預測。無論是簡單的 Chronos-tiny 模型還是更複雜的 Chronos 大型集合模型,都能夠有效地應對不同型別的時間序列預測任務。希望這些實戰經驗能夠幫助大家更好地理解和應用 Chronos 模型。