NBEATS 模型以其簡潔高效的架構和可解釋性在時間序列預測領域備受關注。不同於傳統的統計方法,NBEATS 利用深度學習技術,結合多層感知器和雙重殘差連線,能夠有效捕捉資料中的複雜模式,即使在資料量有限的情況下也能取得不錯的預測效果。其核心構建模組「堆積疊」和「區塊」分別處理不同的時間解析度和特定時間模式,例如長期趨勢和短期季節性,進一步提升了模型的預測精確度。此外,NBEATS 提供了通用和可解釋兩種架構組態,可根據實際需求選擇。通用架構直接從資料中學習模式,而可解釋架構則明確區分趨勢和季節性區塊,提升模型的可解釋性。實際應用中,需先匯入相關 Python 函式庫,載入並預處理資料集,接著設定模型引數,例如預測週期、輸入大小等,並使用訓練資料進行模型訓練。完成訓練後,即可使用模型進行預測,並利用均方誤差、均方根誤差、平均絕對百分比誤差等指標評估模型的預測準確度。

神經基礎擴充套件分析(NBEATS)在時間序列預測中的應用

在時間序列預測領域,神經基礎擴充套件分析(NBEATS)是一個簡單但高效的架構。它結合了深層多層感知器(MLP)與雙重殘差連線,能夠在資料稀缺的情況下提供可解釋的預測結果。這使得它成為許多預測任務的理想選擇。讓我們深入瞭解 NBEATS 的技術細節及其實際應用。

神經基礎擴充套件分析(NBEATS)技術概述

NBEATS 架構最早是為了探索深度學習在單變數時間序列預測中的應用而開發的。該架構由多層完全連線層組成,並依賴於前向和後向殘差連線。這一設計使得 NBEATS 在 Makridakis M 競賽中表現優異,超越了現有的統計方法。

NBEATS 的構建模組

NBEATS 的核心構建模組是「堆積疊」。每個堆積疊專注於不同的時間解析度,例如長期趨勢或短期季節性。每個堆積疊中包含多個「區塊」,這些區塊負責捕捉特定的時間模式,如趨勢或季節性。每個區塊都有前驅和預測元件,這些元件幫助從過去的行為中學習並進行時間序列預測。

相關優勢

  • 可解釋性:相比於其他神經網路架構,NBEATS 提供了更高的可解釋性。
  • 訓練速度快:NBEATS 能夠快速訓練,適合多種應用場景。
  • 通用性:透過使用通用且可解釋的架構,NBEATS 能夠應用於各種領域,且無需對架構進行顯著修改。

從圖示中可以看出,NBEATS 架構是一個多層完全連線(FC)網路,並使用 ReLU 啟用函式。完全連線層意味著每個輸入節點都對映到輸出節點,這與卷積層不同。圖示中的預測包括前向基礎擴充套件係數、預測 ff 和後向基礎擴充套件係數、前驅 3b。透過雙重殘差堆積疊原則,區塊被組織成堆積疊,這些堆積疊包括具有分享預測和前驅的層。

殘差堆積疊原則

殘差堆積疊原則是指每個區塊透過考慮前一個區塊的殘差錯誤來迭代更新預測。前向基礎擴充套件係數、預測 ff 用於生成最終預測結果,而後向基礎擴充套件係數、前驅 3b 則用於迭代調整輸入序列。每個區塊的輸入是殘差時間序列,即在減去前一個區塊輸出後剩餘的值。

架構組態

NBEATS 有兩種組態:

  1. 通用架構:不依賴任何特定時間序列知識(如趨勢或季節性),直接從資料集中學習模式。
  2. 可解釋架構:包含趨勢區塊和季節性區塊,能夠捕捉資料集中的趨勢和季節性。

NBEATS 的實際應用

以下是 NBEATS 在實際應用中的具體步驟及程式碼範例。

匯入必要函式庫

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 ray import tune
from neuralforecast.core import NeuralForecast
from neuralforecast.models import NBEATS, NHITS

載入資料集

from neuralforecast.utils import AirPassengersDF

Y_df = AirPassengersDF
Y_df = Y_df.reset_index(drop=True)
Y_df.head()
資料集介紹
| unique_id | ds          | y   |
|-----------|-------------|-----|
| 1.0       | 1949-01-31  | 112.0 |
| 1.0       | 1949-02-28  | 118.0 |
| 1.0       | 1949-03-31  | 132.0 |
| 1.0       | 1949-04-30  | 129.0 |
| 1.0       | 1949-05-31  | 121.0 |

資料切分與模型訓練

train_data = Y_df.head(132)
test_data = Y_df.tail(12)
模型初始化與訓練
horizon = 12
models = [NBEATS(input_size=2 * horizon, h=horizon, max_steps=50)]
nf = NeuralForecast(models=models, freq='M')
nf.fit(df=train_data)

預測與評估

Y_hat_df = nf.predict().reset_index()
Y_hat_df.head()
預測結果介紹
| unique_id | ds          | NBEATS     |
|-----------|-------------|------------|
|           | 1960-01-31  | 427.045990 |
|           | 1960-02-29  | 448.289337 |
|           | 1960-03-31  | 453.882721 |
|           | 1960-04-30  | 455.047668 |
|           | 1960-05-31  | 496.515900 |
模型準確度評估
def calculate_error_metrics(y_true, y_pred):
    mse = mean_squared_error(y_true, y_pred)
    mae = mean_absolute_percentage_error(y_true, y_pred)
    r2 = r2_score(y_true, y_pred)
    print(f"Mean Squared Error: {mse}")
    print(f"Mean Absolute Percentage Error: {mae}")
    print(f"R^2 Score: {r2}")

calculate_error_metrics(test_data[['y']], Y_hat_df['NBEATS'])

內容解密:

程式碼先引入必要函式庫及載入資料集AirPassengersDF,將其轉換為DataFrame格式並顯示頭部資料以便檢視。

資料切分部分將最後一年的資料分割出來作為測試集而將其餘資料作為訓練集。

模型初始化與訓練部分定義了預測週期為「horizon」即「h」=「forecast horizon」,設定了自迴歸輸入「input size」以及最大訓練步數「max_steps」並傳入模型內進行訓練。

接著我們使用模型進行未來十二個月的預測並顯示前五筆預測結果。

最後我們計算與現有真實值作比對得到模型準確度指標並印出。

指引與建議

玄貓認為 NBEATS 在時間序列預測中具有卓越的表現,特別是在資料稀缺的情況下。其可解釋性和快速訓練能力使得它成為多種應用場景的理想選擇。未來隨著更多資料和計算資源的可獲得性,玄貓建議進一步探索 NBEATS 的改進版本及其在不同領域的應用。

神經網路應用於時間序列預測

在這一章節中,我們將探討神經網路架構在時間序列預測中的應用。透過實際案例,玄貓將解釋如何利用卷積神經網路(CNN)、遞迴神經網路(RNN)以及長短期記憶(LSTM)來進行時間序列預測。此外,我們也會探討一些關鍵術語,如膨脹卷積、因果卷積以及未來共變數等。

2.1 各類別神經網路架構

我們首先來看看三種型別的神經網路架構:CNN、RNN 和 LSTM。

2.1.1 摺積神經網路(CNN)

CNN 在影像處理領域非常成功,但它也可以應用於時間序列預測。透過將時間序列資料轉換為二維影像,我們可以利用 CNN 的強大特徵提取能力來進行預測。這種方法特別適合處理具有區域性相關性的資料。

2.1.2 遞迴神經網路(RNN)

RNN 是專為處理序列資料設計的,它能夠捕捉資料中的時間依賴性。然而,RNN 在處理長序列資料時可能會出現梯度消失或爆炸的問題。因此,我們通常會使用 LSTM 來解決這些問題。

2.1.3 長短期記憶(LSTM)

LSTM 是 RNN 的一種變體,它透過引入門控機制來解決梯度消失和爆炸的問題。LSTM 能夠更有效地捕捉長期依賴性,因此在時間序列預測中表現出色。

2.2 深度自迴歸模型(DeepAR)

DeepAR 是一種根據自迴歸模型的深度學習方法,它能夠有效地處理複雜的時間序列資料。DeepAR 結合了 RNN 和注意力機制,能夠生成機率預測結果,並提供不確定性範圍。

import pytorch_lightning as pl
from gluonts.dataset.common import ListDataset
from gluonts.trainer import Trainer
from gluonts.model.deepar import DeepAREstimator
import numpy as np

# 資料準備
data = [
    {
        "start": np.datetime64("2018-01-01"),
        "target": np.array([1, 2, 3, 4, 5]),
    }
]

dataset = ListDataset(data, freq="D")

# 模型定義
estimator = DeepAREstimator(freq="D", prediction_length=3)
trainer = Trainer(epochs=5)
predictor = trainer.train(estimator, train_data=dataset)

# 預測
forecast = predictor.predict(dataset)

內容解密:

這段程式碼展示瞭如何使用 DeepAR 模型進行時間序列預測。首先,我們準備了資料並將其轉換為 GluonTS 所需的格式。接著,我們定義了 DeepAR 模型並進行訓練。最後,我們使用訓練好的模型進行預測。

2.3 神經基礎擴充套件分析(NBEATS)

NBEATS 是一種簡單而有效的時間序列預測模型,它透過堆積疊多個線性層來捕捉資料中的趨勢和週期性模式。NBEATS 的設計使其能夠生成可解釋的結果,並且在各種時間序列預測任務中表現出色。

from gluonts.model.n_beats import NBEATSEstimator

# 模型定義
estimator = NBEATSEstimator(
    freq="D",
    prediction_length=3,
    input_dimension=1,
    context_length=10,
    stack_types=["trend", "seasonality"],
    num_stacks=2,
    num_layers=2,
    num_block_layers=4,
)

# 模型訓練
trainer = Trainer(epochs=5)
predictor = trainer.train(estimator, train_data=dataset)

# 預測
forecast = predictor.predict(dataset)

內容解密:

這段程式碼展示瞭如何使用 NBEATS 模型進行時間序列預測。與 DeepAR 一樣,我們首先準備好資料並轉換為 GluonTS 所需的格式。接著,我們定義 NBEATS 模型並進行訓練。最後,我們使用訓練好的模型進行預測。

2.4 時間卷積網路(TCN)

時間卷積網路(TCN)是一種專為處理序列資料設計的卷積神經網路。TCN 能夠捕捉長期依賴性並具有因果性和可遷移性等優點。由於這些特點,TCN 在時間序列預測中表現出色。

2.5 模型評估與比較

在實際應用中,我們需要評估各種模型的表現並選擇最適合的模型。以下是一些常見的評估指標:

  • 均方誤差(MSE):衡量預測值與真實值之間的平均平方差。
  • 均方根誤差(RMSE):MSE 的平方根,提供了一個更直觀的誤差範圍。
  • 平均絕對百分比誤差(MAPE):衡量預測值與真實值之間的平均絕對百分比差異。
  • R² 偏差:衡量模型對於資料變異的解釋能力。
  • 調整後 R² 偏差:考慮模型複雜度後的 R² 偏差。

此圖示展示了歷史時間序列資料、預測值以及實際值之間的關係:

  graph TD;
    A[過去時間序列值] --> B[平均預測];
    B --> C[實際時間序列值];

此圖示展示了歷史時間序列資料、預測值以及實際值之間的關係:A代表過去時間序列值;B代表平均預測;C代表實際值。

import matplotlib.pyplot as plt

# 資料索引設定
train_data.set_index('ds', inplace=True)
Y_hat_df.set_index('ds', inplace=True)
test_data.set_index('ds', inplace=True)

plt.figure(figsize=(20, 3))
item_id = "airline_1"
y_past = train_data["y"]
y_pred = Y_hat_df['NBEATS']
y_test = test_data["y"]

plt.plot(y_past, label="過去時間序列值")
plt.plot(y_pred, label="平均預測")
plt.plot(y_test, label="實際時間序列值")
plt.title('AirPassengers 預測', fontsize=10)
plt.ylabel('每月乘客', fontsize=10)
plt.xlabel('時戳 [t]', fontsize=10)
plt.legend();

2.6 未來趨勢與挑戰

隨著人工智慧技術的不斷進步,神經網路在時間序列預測中的應用也將越來越廣泛。未來,我們可以期待更多創新性的模型和方法出現,例如根據注意力機制的變壓器模型等。然而,隨之而來的挑戰也不可忽視,例如資料品質、計算資源等問題。

延伸閱讀

玄貓建議讀者可以參考以下資料進一步深入瞭解:

  1. GitHub - autogluon/autogluon: Fast and Accurate ML in Three Lines of Code.
  2. Olivier Sprangers, Sebastian Schelter, Maarten de Rijke (2023). Parameter-Efficient Deep Probabilistic Forecasting.
  3. Boris N. Oreshkin, Dmitri Carpov, Nicolas Chapados, Yoshua Bengio (2019). “N-BEATS: Neural Basis Expansion Analysis for Interpretable Time Series Forecasting.”

希望這些資料能夠幫助大家更好地理解和應用神經網路在時間序列預測中的技術!