時間序列預測在各領域都有廣泛應用,例如金融市場預測、產品銷售預測等。傳統的時間序列模型,例如 ARIMA,在處理複雜非線性關係時常常力有不逮。神經網路模型,特別是卷積神經網路(CNN)的變體,例如 TCN(暫時性卷積網路),在處理時間序列資料方面展現出顯著的優勢。TCN 能有效捕捉資料中的長期依賴性,並具有較高的計算效率。本文將介紹如何使用 TCN 進行時間序列預測,並探討其核心技術細節,包含模型架構、程式碼實作、以及如何使用 Python 和相關函式庫進行模型訓練、預測和評估。此外,本文還會介紹 BiTCN(雙向時序卷積網路),一種更進階的 TCN 架構,它結合了前向和後向 TCN 的預測能力,能更全面地捕捉時間序列資料的特性。我們將以 AirPassengers 資料集為例,逐步展示如何使用 TCN 和 BiTCN 進行時間序列預測,並解釋模型中重要的引數和技術概念,例如膨脹卷積、殘差連線、感知域以及未來和歷史共變數等。
時間序列資料的神經網路
使用時間序列進行預測
import matplotlib.pyplot as plt
# 繪製實際與預測值的比較圖
plt.ylabel('每月乘客數', fontsize=10)
plt.xlabel('時間戳 [t]', fontsize=10)
plt.fill_between(
y_pred.index, y_pred["0.1"], y_pred["0.9"], color="red",
alpha=0.1, label=f"10%-90% 信賴區間"
)
plt.legend();
內容解密:
- 圖表解釋:這段程式碼使用 Matplotlib 函式庫繪製實際值與預測值的比較圖。Y 軸標籤為「每月乘客數」,X 軸標籤為「時間戳 [t]」。填充區間顯示的是 10%-90% 的信賴區間,這表示預測值在這個區間內有很高的信心度。
- 信賴區間:信賴區間是統計學中的一個概念,表示在某個信心水準下,預測值會落在這個區間內。這裡使用了紅色區域來表示,並且透明度設定為 0.1,使得底層的資料仍然可見。
- 圖例:圖例顯示了該填充區間的標籤,方便讀者理解。
暫時性卷積網路(TCN)
暫時性卷積網路(TCN)是一種專門用於處理時序資料的卷積神經網路架構。這類別模型透過利用卷積操作來捕捉資料中的模式和長期依賴性,進而提升預測的準確性。
時序維度
時序維度是指資料集中代表時間進展的維度。在時間序列資料中,這通常可以透過觀察哪些欄位按時間順序排列來辨識。例如,在航空旅行資料集中,年份就是一個時序維度。在時間序列預測中,時序維度幫助我們理解過去觀察值對未來值的影響。
暫時性卷積網路的技術概述
暫時性卷積網路(TCN)透過多層卷積層來捕捉時間序列資料中的模式和長期依賴性。以下是 TCN 的主要組成部分:
輸入層
輸入層可以被視為一個 L X F 的矩陣,其中 L 是時間序列的長度,F 是特徵數量。
塊狀卷積層
塊狀卷積層應用一個 K x F 的滑動視窗(滑動視窗大小為 K)到時間序列資料上。滑動視窗的步長由 S 表示。每個滑動視窗與輸入序列進行卷積運算,生成一個長度為 T 的輸出序列。
填充操作
填充操作確保輸出序列與輸入序列具有相同的長度。零填充是在輸入序列的開始和結束處新增零。
膨脹卷積
膨脹卷積透過增加滑動視窗內權重之間的距離來捕捉長期依賴性。膨脹因子 D 控制這些距離。
啟用函式
每個卷積層的輸出會透過啟用函式(如 ReLU 或 Sigmoid)進行非線性變換。
殘差連線
殘差連線允許資訊直接從前一層傳遞到後一層,這有助於避免梯度消失問題並提升訓練穩定性。
池化層
池化層透過選擇滑動視窗內最大或平均值來降低特徵圖的維度。這有助於提取重要特徵並降低計算成本。
輸出層
TCN 的輸出為每個時間步驟的預測值。對於我們的預測任務,我們可以使用線性函式來生成最終預測:
[ y(T+1) = W \cdot H(T) + b ]
其中 ( W ) 是最終線性層的權重矩陣,( b ) 是偏移向量,( H(T) ) 是最後一個卷積塊的特徵向量,( y(T+1) ) 是下一個時間步驟的預測值。
損失函式
損失函式衡量預測輸出與實際輸出之間的差異。對於我們的任務,我們可以使用均方誤差 (MSE)。
最佳化
模型引數(權重和偏移)使用梯度下降演算法(如 Adam 或 SGD)進行計算,以最小化損失函式。
另外一個需要了解的關鍵概念是輸入感知域(IRF)。IRF 是單一輸出神經元從輸入序列接收資訊的最大時間跨度。
TCN 的感知域取決於三個引數:(a) 塊狀核大小、(b) 隱藏層數量以及 (c) 膨脹因子。
暫時性卷積網路實戰演練
現在我們將從理論轉換到實際程式碼實作。首先需要匯入所需函式庫:
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_percentage_error, r2_score
from IPython.display import display, Markdown
import matplotlib.pyplot as plt
from neuralforecast import NeuralForecast
from neuralforecast.losses.pytorch import GMM, MQLoss, DistributionLoss
內容解密:
- 匯入函式庫:這段程式碼匯入了多種函式庫來處理資料、計算評估指標以及展示結果。
- Pandas 和 NumPy:用於資料處理和計算。
- Scikit-learn:用於評估指標計算。
- IPython.display:用於展示 Markdown 格式內容。
- Matplotlib:用於繪製圖表。
- NeuralForecast:用於神經網路模型訓練和預測。
- DistributionLoss:用於損失函式定義。
使用神經網路進行時間序列預測
時間序列預測是一個重要的應用領域,特別是在經濟、氣象和交通等方面。本文將探討如何使用神經網路進行時間序列預測,並以TCN(Temporal Convolutional Network)為例,展示其實作過程及相關技術細節。
使用TCN進行時間序列預測
在開始之前,我們需要準備好資料集。這裡我們使用著名的AirPassenger資料集來進行說明。首先,我們將資料集分成訓練集和測試集。
from neuralforecast.utils import AirPassengersDF as Y_df
Y_train_df = Y_df[Y_df.ds <= '1959-12-31']
Y_test_df = Y_df[Y_df.ds > '1959-12-31']
接下來,我們使用TimeSeriesDataset來載入訓練資料集。
from neuralforecast.tsdataset import TimeSeriesDataset
dataset, *_ = TimeSeriesDataset.from_df(Y_train_df)
初始化與訓練模型
接下來,我們初始化並訓練TCN模型。以下是一些關鍵引數的解釋:
h:預測的時間範圍。input_size:回溯訓練的最大序列長度。loss:訓練損失函式。learning_rate:學習率。kernel_size:卷積核的大小。dilations:控制卷積核在時間上的間距。encoder_hidden_size:TCN隱藏層的大小。context_size:預測視窗中每個時間戳的上下文向量大小。decoder_hidden_size:MLP解碼器隱藏層的大小。decoder_layers:MLP解碼器的層數。max_steps:最大訓練步數。scaler_type:時間序列輸入標準化的方法。hist_exog_list:歷史外部變數。
from neuralforecast.auto import TCN
from neuralforecast.losses import GMM
from neuralforecast import NeuralForecast
horizon = 12
fcst = NeuralForecast(
models=[
TCN(
h=horizon,
input_size=-1,
loss=GMM(n_components=7, return_params=True, level=[80, 90]),
learning_rate=5e-4,
kernel_size=2,
dilations=[1, 2, 4, 8, 16],
encoder_hidden_size=128,
context_size=10,
decoder_hidden_size=128,
decoder_layers=2,
max_steps=500,
scaler_type='robust',
hist_exog_list=None
)
],
freq='M'
)
fcst.fit(df=Y_train_df)
預測未來值
完成模型訓練後,我們可以使用模型進行預測。以下是預測未來值的程式碼:
y_hat = fcst.predict()
y_hat.set_index('ds', inplace=True)
y_hat.head()
評估模型精確度
接下來,我們評估模型的精確度。以下是計算各種錯誤指標的程式碼:
from neuralforecast.metrics import calculate_error_metrics
calculate_error_metrics(Y_test_df[['y']], y_hat[['TCN']])
這裡我們得到了以下錯誤指標:
- MSE(均方誤差):433.3346862792969
- RMSE(均方根誤差):20.816692352294922
- MAPE(平均絕對百分比誤差):0.03554682061076164
- R²(決定係數):0.9217732930276429
- 調整後R²:0.9139506223304071
視覺化預測結果
最後,我們可以將預測結果視覺化。以下是視覺化程式碼:
import matplotlib.pyplot as plt
Y_train_df.set_index('ds', inplace=True)
Y_test_df.set_index('ds', inplace=True)
plt.figure(figsize=(20, 3))
y_past = Y_train_df["y"]
y_pred = y_hat[['TCN']]
y_test = Y_test_df["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', fontsize=10)
plt.ylabel('Monthly Passengers', fontsize=10)
plt.xlabel('Timestamp [t]', fontsize=10)
plt.legend()
plt.show()
小段落標題內容解密:
以上程式碼中,我們首先設定圖表的大小為 (20, 3)。然後分別繪製過去的時間序列值、TCN 模型的預測值以及實際的時間序列值。最終,我們設定圖表標題及軸標籤並顯示圖例。
這些圖表幫助我們直觀地看到模型預測結果與實際值之間的差異。從圖表中可以看出,我們的模型預測結果與實際值相當接近,表明模型具有一定的預測能力。
雙向時序卷積網路(BiTCN)
在上一節中,我們瞭解了TCN的工作原理。現在,讓我們來瞭解一種利用兩個TCN網路結合預測能力的CNN架構——雙向時序卷積網路(BiTCN)。
雙向時序卷積網路(BiTCN)架構由兩個時序卷積網路組成。第一個網路稱為前向網路,用於編碼未來時序資料;第二個網路稱為後向網路,用於編碼過去觀察資料和外部變數。這種技術有助於保留時序資料中的時間資訊。
BiTCN相較於RNN方法如LSTM更加計算高效,並且相比於根據轉換器架構(在後續章節中介紹)的一些新架構而言,其引數規模較小(空間複雜度較低)。BiTCN屬於單變數模型類別。
未來共變數
在時間序列模型中,未來共變數是指不包含在當前資料集中的變數,這些變數能夠幫助解釋或預測時間序列中的結果變數。例如,在飛機延遲預測中,過去機場資料可以搭配未來天氣資料和即將到來的重大假日來改善預測結果。
歷史共變數
歷史共變數是指影響過去時間序列預測結果的外部變數。例如,過去氣候條件或維護歷史可能影響過去飛機延遲情況。歷史共變數與未來共變數不同之處在於它提供了過去資料的一些背景資訊。
此圖示展示了雙向時序卷積網路結構
graph TD;
D[D]
A[Input Data] --> B[Forward TCN];
A --> C[Backward TCN];
B --> D{Output Layer};
C --> D;
D --> E[Prediction];
小段落標題內容解密:
此圖示展示了雙向時序卷積網路結構。圖中的「Input Data」表示輸入資料,「Forward TCN」表示前向卷積網路,「Backward TCN」表示後向卷積網路,「Output Layer」表示輸出層,「Prediction」表示最終預測結果。
這個架構展示瞭如何利用前向和後向兩個TCN組成更完整、更準確的時間序列預測模型。「Forward TCN」負責處理未來可能會影響到結果的部分,「Backward TCN」則處理已經發生並可能對結果產生影響的人事物。「Output Layer」則整合這些處理過後所得到的各項特徵之資訊以做出最後之判斷與「Prediction」。