Time-LLM 是一種利用大語言模型 (LLM) 進行時間序列預測的新方法。它透過結合語言模型的理解能力和時間序列資料的特性,提供了一個新的預測思路。不同於傳統的時間序列模型,Time-LLM 使用前置詞和補丁作為輸入,引導 LLM 生成具有時間資訊的嵌入。這些嵌入經過平坦化和線性投影後,即可轉換為時間序列預測。這種方法巧妙地利用了 LLM 在處理序列資料方面的優勢,並將其應用於時間序列預測領域。在實際應用中,Time-LLM 可以處理單變數和多變數時間序列資料,並能根據不同的資料集和預測目標進行調整。透過調整模型的超引數,例如輸入尺寸、批次大小和預測視窗長度等,可以進一步最佳化模型的效能。此外,前置詞的設計也至關重要,它能提供必要的背景資訊,幫助 LLM 更好地理解資料集的特性,從而提高預測的準確性。
Time-LLM:重新程式設計大語言模型
在當今快速發展的資料科學與人工智慧領域,如何將大語言模型(LLM)應用於時間序列預測已成為一大挑戰。Time-LLM 正是為解決這一問題而設計的一種技術,其核心概念是利用語言模型來生成時間序列預測。
Time-LLM 的基本原理
Time-LLM 的運作機制可分為以下幾個步驟:
前置詞與補丁: 提供給 LLM 的輸入包括前置詞和補丁。前置詞用來告知模型資料的背景,而補丁則是具體的資料片段。
嵌入生成: LLM 接收這些輸入後,會生成輸出嵌入。由於這些嵌入來自於一個經過語言訓練的 LLM,因此需要進一步轉換成時間序列預測。
平坦化與線性投影: 這些嵌入經過平坦化處理後,再應用線性投影,最終得到所需的時間序列預測。
Time-LLM 的實際應用
接下來,玄貓將透過具體的案例來解釋 Time-LLM 的實際應用。這些案例包括單變數和多變數問題的解決方案。
4.2.1 單變數案例
在單變數案例中,我們將探討如何使用 Time-LLM 來解決單一變數的時間序列預測問題。以下是具體的程式碼實作:
import torch
import psutil
import platform
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
from neuralforecast import NeuralForecast
from neuralforecast.models import TimeLLM
from neuralforecast.utils import AirPassengersPanel, augment_calendar_df
from transformers import GPT2Config, GPT2Model, GPT2Tokenizer
# 檢查 GPU 和 CPU 資訊
use_cuda = torch.cuda.is_available()
if use_cuda:
print('__CUDNN VERSION:', torch.backends.cudnn.version())
print('__Number CUDA Devices:', torch.cuda.device_count())
print('__CUDA Device Name:', torch.cuda.get_device_name(0))
print('__CUDA Device Total Memory [GB]:', torch.cuda.get_device_properties(0).total_memory / 1e9)
# 輸出記憶體、CPU 和平台資訊
mem = psutil.virtual_memory()
print("Available Memory:")
print(" Total:", mem.total / (1024 ** 2), "MB")
cpu_count = psutil.cpu_count()
cpu_count_logical = psutil.cpu_count(logical=True)
print("\nCPU Details:")
print(" Physical Cores:", cpu_count)
print(" Logical Cores:", cpu_count_logical)
platform_info = platform.platform()
print("\nPlatform:", platform_info)
# 載入 AirPassenger 資料集並分割為訓練和測試集
from neuralforecast.utils import AirPassengersDF
Y_df = AirPassengersDF.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'] # 測試集
# 初始化 GPT-2 模型及其組態
gpt2_config = GPT2Config.from_pretrained('openai-community/gpt2')
gpt2 = GPT2Model.from_pretrained('openai-community/gpt2', config=gpt2_config)
gpt2_tokenizer = GPT2Tokenizer.from_pretrained('openai-community/gpt2')
# 前置詞設定
prompt_prefix = "The dataset contains data on monthly air passengers. There is a yearly seasonality"
# 初始化 TimeLLM 模型及其超引數設定
horizon = 12 # 預測視窗長度
timellm = TimeLLM(
h=horizon,
input_size=36,
llm=gpt2,
llm_config=gpt2_config,
llm_tokenizer=gpt2_tokenizer,
prompt_prefix=prompt_prefix,
batch_size=24,
windows_batch_size=24)
# 初始化 NeuralForecast 模型並進行訓練
nf = NeuralForecast(models=[timellm], freq='M')
nf.fit(df=Y_train_df, val_size=12)
#### 內容解密:
```python
import torch: 使用 PyTorch 框架進行深度學習模型的建構與訓練。
import psutil: 用於取得系統資源資訊,如記憶體和 CPU 資訊。
import platform: 用於取得作業系統相關資訊。
import numpy as np: 提供了數值計算的功能。
import pandas as pd: 提供了資料處理和分析的功能。
import matplotlib.pyplot as plt: 用於繪製圖表。
from sklearn.metrics: 提供了多種評估模型效能的指標,如均方誤差(MSE)和均方根誤差(RMSE)。
from neuralforecast: 自定義的時間序列預測函式庫。
from transformers: 提供了預訓練的語言模型(如 GPT-2)。
該段程式碼主要完成了環境設定、資料載入、GPT-2 模型初始化以及 TimeLLM 模型的組態。透過這些步驟,我們建立了一個完整的時間序列預測框架。
小段落標題:環境設定及資料準備
use_cuda: 判斷是否可使用 GPU 加速。
psutil.virtual_memory(): 獲得電腦記憶體相關資訊。
psutil.cpu_count(): 獲得 CPU 基本資訊。
AirPassengersDF.reset_index(drop=True): 載入並重置索引。
該段程式碼完成了環境檢查與資料載入工作,確保所有必要的硬體資源及資料都已準備就緒。
小段落標題:GPT-2 模型初始化
GPT2Config.from_pretrained(): 載入 GPT-2 的預訓練組態。
GPT2Model.from_pretrained(): 載入 GPT-2 模型權重。
GPT2Tokenizer.from_pretrained(): 載入 GPT-2 標記器權重。
該段程式碼完成了對 GPT-2 模型及其標記器的初始化,為後續工作做好了準備。
小段落標題:TimeLLM 模型組態
horizon: 預測視窗長度設定為 12 個月。
input_size: 自迴歸輸入尺寸設定為 36 個月。
llm: 指定使用 GPT-2 模型。
llm_config: 指定 GPT-2 模型組態。
llm_tokenizer: 指定 GPT-2 標記器組態。
prompt_prefix: 前置詞設定,提供資料背景資訊。
batch_size: 每個批次中不同序列的數量設定為 24 個。
windows_batch_size: 每個訓練批次中抽樣視窗數量設定為 24 個。
該段程式碼完成了對 TimeLLM 模型超引數的詳細組態,確保模型能夠有效執行。
小段落標題:NeuralForecast 模型訓練
NeuralForecast(models=[timellm], freq='M'): 初始化 NeuralForecast 模型並指定使用 TimeLLM 作為預測模型且頻率為月份級別。
nf.fit(df=Y_train_df, val_size=12): 根據訓練集進行模型訓練並設定驗證集大小為 1 年(12 個月)。
該段程式碼完成了對 NeuralForecast 模型的初始化及訓練工作,根據 AirPassenger 資料集進行時間序列預測。
4.3 預測與評估
接下來,玄貓將展示如何利用已訓練好的模型進行預測並評估其效能。
# 預測結果生成與評估
forecasts = nf.predict()
forecasts.head()
#### 內容解密:
```python
nf.predict(): 根據已訓練好的模型進行預測並輸出預測結果。
forecasts.head(): 檢視前幾個預測結果以進行檢查。
該段程式碼完成了根據已訓練模型進行預測以及顯示部分預測結果,以便後續進行評估。
小段落標題:誤差計算
calculate_error_metrics(Y_test_df[['y']], forecasts['TimeLLM']): 根據真實值與預測值計算多種誤差指標(如 MSE、RMSE、MAPE、R²)。
該段程式碼完成了根據真實值與預測值之間誤差計算,從而評估模型效能。
小段落標題:結果視覺化
plt.figure(figsize=(20, 3)): 建立一個圖表框架並設定圖表大小。
y_past: 獲得歷史真實值以便繪圖對比。
y_pred: 獲得模型預測值以便繪圖對比。
y_test: 獲得未來真實值以便繪圖對比。
plt.plot(): 分別繪製歷史真實值、模型預測值以及未來真實值曲線,便於直觀對比觀察其差異情況。
plt.title(): 設定圖表標題以便描述圖表內容資訊。此圖示展示了空乘客數量隨著時間變化趨勢對比效果。
該段程式碼完成了結果視覺化工作,直觀地展示了歷史真實值、未來真實值與模型預測值之間的關係,便於進一步分析最佳化。
此圖示展示了空乘客數量隨著時間變化趨勢對比效果:
graph TD;
A[過去時序資料] --> B[歷史趨勢];
B --> C[未來真實趨勢];
D[模擬趨勢] --> E[未來預測趨勢];
評估結果
根據上述程式碼中的誤差計算結果可知:
- MSE(均方誤差):9581.9990
- RMSE(均方根誤差):97.8877
- MAPE(均方百分比誤差):0.173 或 17.3%
- R²(決定係數): -0.730
從以上指標可以看出,雖然 R² 是負數,顯示出模擬趨勢存在較大偏差且不足以完整解釋目標變數變動情況。但總體而言,該模式在捕捉空乘客數量年週期性波動方面仍有不錯表現。
未來改進方向
未來可以考慮以下幾種改進策略:
- 引入更多特徵:增加其他影響乘客數量的特徵(如季節性活動、經濟狀況等),這樣可以提高模擬精確度。
graph TD;
A[空乘客資料] --> B[季節性因素];
B --> C[經濟狀況];
C --> D[歷史氣候];
此圖示展示了改進策略中的特徵考慮因素關係:
假若增強更多特徵來源可能會提升整體精確度且避免過擬合問題發生。
由以上內容可以看出 Time-LLM 在解決單變數時間序列問題上表現尚可。然而在未來應用中還需要考慮更多外部影響因素以及更深層次特徵挖掘技術結合使用以提升整體效能。
時間序列預測的AI模型重構:TIME-LLM
在現代資料科學中,時間序列預測是一個非常重要的應用領域。為了提升時間序列預測的精確度,許多研究者開始探索如何將大語言模型(LLM)應用於這一領域。本文將探討如何重構大語言模型來進行時間序列預測,並透過具體案例來展示其應用。
硬體環境與資源組態
首先,玄貓將展示當前硬體環境的組態,這對於理解後續的模型訓練與預測至關重要。以下是當前系統的GPU和CPU資訊:
import torch
import psutil
import platform
use_cuda = torch.cuda.is_available()
if use_cuda:
print('__CUDNN VERSION:', torch.backends.cudnn.version())
print('__Number CUDA Devices:', torch.cuda.device_count())
print('__CUDA Device Name:', torch.cuda.get_device_name(0))
print('__CUDA Device Total Memory [GB]:', torch.cuda.get_device_properties(0).total_memory / 1e9)
mem = psutil.virtual_memory()
print("Available Memory:")
print(" Total:", mem.total / (1024 ** 2), "MB")
cpu_count = psutil.cpu_count()
cpu_count_logical = psutil.cpu_count(logical=True)
print("\nCPU Details:")
print(" Physical Cores:", cpu_count)
print(" Logical Cores:", cpu_count_logical)
platform_info = platform.platform()
print("\nPlatform:", platform_info)
內容解密:
上述程式碼用於檢查當前系統的硬體組態,包括GPU和CPU資訊。這些資訊對於後續的模型訓練與預測至關重要。例如,GPU的版本和記憶體大小會影響模型訓練的速度和效率。
資料集準備
接下來,玄貓將使用「AirPassengers」資料集來進行時間序列預測。這個資料集包含了每月航空乘客數量,並且具有明顯的季節性特徵。
from neuralforecast.utils import AirPassengersPanel, augment_calendar_df
AirPassengersPanel, calendar_cols = augment_calendar_df(df=AirPassengersPanel, freq='M')
Y_train_df = AirPassengersPanel[AirPassengersPanel.ds < AirPassengersPanel['ds'].values[-12]]
Y_test_df = AirPassengersPanel[AirPassengersPanel.ds >= AirPassengersPanel['ds'].values[-12]].reset_index(drop=True)
內容解密:
上述程式碼用於載入「AirPassengers」資料集並將其分割為訓練集和測試集。具體來說,最後12個月的資料被分配為測試集,而前面的資料則作為訓練集。這樣的分割方法可以確保模型在訓練時不會看到測試資料,從而避免過擬合。
GPT-2 模型設定
為了將大語言模型應用於時間序列預測,玄貓使用了GPT-2模型。以下是GPT-2模型的設定程式碼:
from transformers import GPT2Config, GPT2Model, GPT2Tokenizer
gpt2_config = GPT2Config.from_pretrained('openai-community/gpt2')
gpt2 = GPT2Model.from_pretrained('openai-community/gpt2', config=gpt2_config)
gpt2_tokenizer = GPT2Tokenizer.from_pretrained('openai-community/gpt2')
prompt_prefix = "The dataset contains data on monthly air passengers. There is a yearly seasonality"
內容解密:
上述程式碼用於載入GPT-2模型及其組態。prompt_prefix用於提供給模型一些背景資訊,這有助於模型更好地理解資料集的特徵。
模型初始化與訓練
接下來,玄貓將初始化並訓練TIME-LLM模型。以下是相關程式碼:
from neuralforecast import NeuralForecast
from neuralforecast.models import TimeLLM
horizon = 12
timellm = TimeLLM(
h=horizon,
input_size=36,
llm=gpt2,
llm_config=gpt2_config,
llm_tokenizer=gpt2_tokenizer,
prompt_prefix=prompt_prefix,
batch_size=24,
windows_batch_size=24
)
nf = NeuralForecast(models=[timellm], freq='M')
nf.fit(df=Y_train_df, val_size=12)
內容解密:
上述程式碼用於初始化並訓練TIME-LLM模型。horizon表示預測的時間步長,input_size表示自迴歸輸入的大小。batch_size和windows_batch_size則影響了模型的訓練效率。
模型預測與評估
在完成模型訓練後,玄貓將使用測試資料進行預測並評估模型的準確性:
forecasts = nf.predict(futr_df=Y_test_df)
from sklearn.metrics import mean_squared_error, mean_absolute_percentage_error, r2_score
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)
r_squared = r2_score(y_true, y_pred)
adjusted_r_squared = 1 - (1 - r_squared) * (len(y_true) - 1) / (len(y_true) - len(y_pred.columns) - 1)
return mse, rmse, mape, r_squared, adjusted_r_squared
mse, rmse, mape, r_squared, adjusted_r_squared = calculate_error_metrics(Y_test_df[['y']], forecasts['TimeLLM'])
print(f"MSE: {mse}")
print(f"RMSE: {rmse}")
print(f"MAPE: {mape}")
print(f"R^2: {r_squared}")
print(f"Adjusted R^2: {adjusted_r_squared}")
內容解密:
上述程式碼用於計算模型的評估指標,包括均方誤差(MSE)、均方根誤差(RMSE)、平均絕對百分比誤差(MAPE)以及決定係數(R²)。這些指標可以幫助我們評估模型的預測精確度。
視覺化預測結果
最終,玄貓將使用圖表來視覺化預測結果:
import matplotlib.pyplot as plt
train_df_1 = Y_train_df[Y_train_df.unique_id == 'Airline1']
airline_df_1 = Y_test_df[Y_test_df.unique_id == 'Airline1']
train_df_1.set_index('ds', inplace=True)
forecasts.set_index('ds', inplace=True)
airline_df_1.set_index('ds', inplace=True)
plt.figure(figsize=(20, 3))
y_past = train_df_1["y"]
y_pred = forecasts['TimeLLM'][:12]
y_test = airline_df_1["y"]
plt.plot(y_past, label="Past time series values")
plt.plot(y_pred, label="Forecast")
plt.plot(y_test, label="Actual time series values")
plt.title('AirPassengers Forecast for Airline1', fontsize=10)
plt.ylabel('Monthly Passengers', fontsize=10)
plt.xlabel('Timestamp [t]', fontsize=10)
plt.legend();
此圖示展示了Airline1在過去、預測及實際乘客數量之間的關係。從圖中可以看出,模型的預測結果與實際資料存在一定差異。
