深層学習によるビジネス時系列分析ツール NeuralForecast(2)
– NeuralForecastの簡易チュートリアル(RNNからPatchTSTまで) –

深層学習によるビジネス時系列分析ツール NeuralForecast(2)– NeuralForecastの簡易チュートリアル(RNNからPatchTSTまで) –

NeuralForecastは、時系列予測の分野で革新的な変化をもたらすツールです。

前回、NeuralForecastの概要について説明しました。

深層学習によるビジネス時系列分析ツール NeuralForecast(1)– 導入編:NeuralForecastとは何か? –

今回は、NeuralForecastの基本的なインストール方法と、簡単な時系列予測の構築方法を紹介します。

Pythonを使用した実用的な例を通じて、ビジネスにおける時系列データの予測方法を理解し、実行するステップを説明します。

具体的には、比較的古典的な時系列深層学習であるRNNから、最先端の時系列トランスフォーマーであるPatchTSTまで対象にしています。

NeuralForecastのインストール

NeuralForecastのインストールは、Pythonのパッケージインデックス(PyPI)またはCondaを使用して行います。

PyPIでのインストールは以下です。

pip install neuralforecast

 

condaでのインストールは以下です。

conda install -c conda-forge neuralforecast

 

NeuralForecastで時系列予測構築例

 利用するデータセット

NeuralForecastで提供されているデータセットAirPassengersDF を使います。

このデータセットは、航空旅客の月次数を記録したもので、時系列分析や予測モデリングの教材としてよく用いられます。特に、季節性、トレンド、その他の時系列のパターンを理解し分析するための典型的な例として扱われます。

 

 1つのモデルで構築する(RNN)

RNNモデルで構築する乗客数を予測するモデルを検討します。学習データでモデル構築し、テストデータで検証します。

ちなみに、RNNは、時系列データやシーケンスデータを扱うのに適したニューラルネットワークです。連続するデータ間の時間的な依存関係をモデル化することができます。

 

先ず、必要なライブラリをインポートし、データセットを準備します。

以下、コードです。

import numpy as np
import pandas as pd

from neuralforecast import NeuralForecast
from neuralforecast.models import RNN
from neuralforecast.utils import AirPassengersDF

from sklearn.metrics import (
    mean_absolute_error, 
    mean_absolute_percentage_error, 
    r2_score
)

import matplotlib.pyplot as plt
plt.style.use('ggplot') # グラフのスタイル
plt.rcParams['figure.figsize'] = [12, 9] # グラフサイズ設定
plt.rcParams['font.size'] = 12 # デフォルトのフォントサイズ
plt.rcParams['axes.labelsize'] = 14 # 軸ラベルのフォントサイズ
plt.rcParams['xtick.labelsize'] = 10 # x軸ティックラベルのフォントサイズ
plt.rcParams['ytick.labelsize'] = 10 # y軸ティックラベルのフォントサイズ
plt.rcParams['legend.fontsize'] = 12 # 凡例のフォントサイズ
plt.rcParams['figure.titlesize'] = 16 # 図のタイトルのフォントサイズ

 

  • numpy: 数値計算を行うためのライブラリ。多次元配列操作や数学関数などが含まれています。
  • pandas: データ操作や分析のためのライブラリ。データフレームという形式でデータを扱います。
  • neuralforecast: 時系列予測のためのライブラリ。この中から NeuralForecast クラスと RNN モデルがインポートされています。
  • neuralforecast.utils: ここから AirPassengersDF がインポートされています。これは航空旅客数の時系列データセットを提供する可能性があります。
  • sklearn.metrics: 機械学習モデルのパフォーマンス評価指標を提供するライブラリ。ここでは、MAE(平均絶対誤差)、MAPE(平均絶対パーセンテージ誤差)、R2スコアがインポートされています。
  • matplotlib.pyplot: データを視覚化するためのライブラリ。グラフやチャートを作成するために使用されます。

 

次に、データを学習用とテスト用に分割します。

以下、コードです。

# データの準備
Y_df = AirPassengersDF
Y_train_df = Y_df[Y_df.ds <= '1959-12-31']
Y_test_df = Y_df[Y_df.ds > '1959-12-31']
horizon = len(Y_test_df)

 

  • Y_dfAirPassengersDF(航空旅客数の時系列データセット)を代入しています。
  • Y_train_dfY_df から1959年12月31日までのデータをトレーニング用データセットとして選択しています。これは、特定の日付を基準にデータを分割しています。
  • Y_test_dfY_df から1959年12月31日より後のデータをテスト用データセットとして選択しています。このデータはモデルのパフォーマンスを評価する際に使用されます。
  • horizon はテストデータセット Y_test_df の長さ(データポイントの数)を示しています。これは、予測モデルが未来にどれだけ先まで予測するかを示します。

 

学習データで、RNNを用いて予測モデルを構築します。

以下、コードです。

# モデルのパラメータ
rnn_params = {
    'input_size': 2 * horizon, 
    'h': horizon, 
    'max_steps': 50, 
}

# モデルのインスタンス
rnn_model = RNN(**rnn_params)
nf = NeuralForecast(models=[rnn_model], freq='M')

# モデルの学習
nf.fit(df=Y_train_df)

 

  • モデルのパラメータ:
    • rnn_params という辞書を作成し、RNNモデルのパラメータを設定しています。
    • input_size はモデルの入力サイズを定義し、ここでは 2 * horizonhorizon は以前のコードで定義されたテストデータセットの長さ)を使用しています。
    • h は予測の水平線(予測期間)を示し、ここでも horizon を使用しています。
    • max_steps はモデルのトレーニング中の最大ステップ数を設定しています。ここでは50に設定されています。
  • モデルのインスタンス:
    • RNN クラスを使用してRNNモデルを構築しています。このとき、rnn_params 辞書の内容をパラメータとして渡しています。
    • NeuralForecast クラスを使用して、時系列予測モデルのトレーニング環境を作成しています。ここでは rnn_model をモデルとして指定し、時系列データの頻度を月次 ('M') と設定しています。
  • モデルの学習:
    • nf.fit メソッドを使用して、トレーニングデータセット Y_train_df でRNNモデルをトレーニングしています。

 

テストデータの予測を行い、結果をプロットします。精度評価指標としてMAPE、MAE、R2を出力します。

以下、コードです。

# 予測の実施
Y_hat_df = nf.predict().reset_index()
Y_hat_df = Y_test_df.merge(Y_hat_df, how='left', on=['unique_id', 'ds'])

# プロット
plot_df = pd.concat([Y_train_df, Y_hat_df]).set_index('ds')
fig, ax = plt.subplots()
plot_df[['y', 'RNN']].plot(ax=ax, linewidth=2)

# 予測精度評価
y_true = Y_test_df['y']
y_pred = Y_hat_df['RNN']
mae = mean_absolute_error(y_true, y_pred)
mape = mean_absolute_percentage_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)

print(f"RNN Model Performance:")
print(f"MAE: {mae}")
print(f"MAPE: {mape}")
print(f"R2 Score: {r2}")

 

  • 予測の実施:
    • nf.predict() を使用して、トレーニング済みのRNNモデルで予測を行います。reset_index() は予測結果のデータフレームのインデックスをリセットします。
    • 予測結果 Y_hat_df とテストデータセット Y_test_df を結合します。この際、unique_idds(日付)カラムを基準に左結合 (how='left') を行います。
  • プロット:
    • トレーニングデータセット Y_train_df と予測結果が含まれる Y_hat_df を結合し、日付 (ds) をインデックスとして設定します。
    • matplotlib を使用して、結合されたデータセット plot_df から実際の値 (y) と予測値 (RNN) を折れ線グラフでプロットします。
  • 予測精度評価:
    • テストデータセットから実際の値 y_true と予測値 y_pred を取得します。
    • mean_absolute_errormean_absolute_percentage_errorr2_score を用いて、MAE、MAPE、R2スコアを計算します。
    • これらのパフォーマンス指標を出力し、RNNモデルの性能を評価します。

 

以下、実行結果です。

RNN Model Performance:
MAE: 290.1596082051595
MAPE: 0.6006616601570595
R2 Score: -15.191620017057232

 

古典的なRNNでは、上手く予測できていません。一工夫必要そうです。

元の時系列データをトレンド成分や季節成分などに分解し多変量時系列データとしたり、差分処理などの時系列データ特有の前処理を実施することで、予測精度を上げることができます。

他には、他の時系列深層学習モデルで実施する、という手もあります。

 

 複数のモデルで構築する

先ほどはRNNモデルで予測モデルを構築してみました。

ここでは、以下の複数の時系列深層学習アルゴリズム(モデルタイプ)で予測モデルを構築していきます。比較的古典的な時系列深層学習であるRNNから、最先端の時系列トランスフォーマーであるPatchTSTまで対象にしています。

モデル 説明
RNN RNNは、時系列データやシーケンスデータを扱うのに適したニューラルネットワークです。連続するデータ間の時間的な依存関係をモデル化することができます。
LSTM LSTMはRNNの一種で、長期的な依存関係をより効果的に学習できるように設計されています。これにより、RNNが通常持つ短期的な依存関係の制限を克服します。
GRU GRUはLSTMに似ていますが、より単純な構造を持っています。これにより、計算効率が向上し、小規模なデータセットでの性能が改善されることがあります。
NBEATS NBEATSは完全に接続されたフィードフォワードニューラルネットワークです。時系列データの基本的なパターンを捉えるために、基底展開法を用いています。
NHITS NHITSはNBEATSに触発されたモデルで、階層的なアプローチを取り入れています。これにより、異なる時間スケールでのパターンをより効果的に捉えることができます。
PatchTST PatchTSTは、トランスフォーマーアーキテクチャを時系列データに適用したモデルです。トランスフォーマーは、長距離の依存関係を効率的にモデル化することができます。

 

先ず、必要なライブラリをインポートし、データセットを準備します。

以下、コードです。

import numpy as np
import pandas as pd

from neuralforecast import NeuralForecast
from neuralforecast.models import (
    RNN, 
    LSTM, 
    GRU, 
    NBEATS, 
    NHITS, 
    PatchTST,
)
from neuralforecast.utils import AirPassengersDF

from sklearn.metrics import (
    mean_absolute_error, 
    mean_absolute_percentage_error, 
    r2_score,
)

import matplotlib.pyplot as plt
plt.style.use('ggplot') # グラフのスタイル
plt.rcParams['figure.figsize'] = [12, 9] # グラフサイズ設定
plt.rcParams['font.size'] = 12 # デフォルトのフォントサイズ
plt.rcParams['axes.labelsize'] = 14 # 軸ラベルのフォントサイズ
plt.rcParams['xtick.labelsize'] = 10 # x軸ティックラベルのフォントサイズ
plt.rcParams['ytick.labelsize'] = 10 # y軸ティックラベルのフォントサイズ
plt.rcParams['legend.fontsize'] = 12 # 凡例のフォントサイズ
plt.rcParams['figure.titlesize'] = 16 # 図のタイトルのフォントサイズ

 

  • numpy: 数値計算を行うためのライブラリ。多次元配列操作や数学関数などが含まれています。
  • pandas: データ操作や分析のためのライブラリ。データフレームという形式でデータを扱います。
  • neuralforecast: 時系列予測のためのライブラリ。この中から NeuralForecast クラスと時系列深層学習モデルであるRNN, LSTM, GRU, NBEATS, NHITS, PatchTSTがインポートされています。
  • neuralforecast.utils: ここから AirPassengersDF がインポートされています。これは航空旅客数の時系列データセットを提供する可能性があります。
  • sklearn.metrics: 機械学習モデルのパフォーマンス評価指標を提供するライブラリ。ここでは、MAE(平均絶対誤差)、MAPE(平均絶対パーセンテージ誤差)、R2スコアがインポートされています。
  • matplotlib.pyplot: データを視覚化するためのライブラリ。グラフやチャートを作成するために使用されます。

 

次に、データを学習用とテスト用に分割します。

以下、コードです。

# データの準備
Y_df = AirPassengersDF
Y_train_df = Y_df[Y_df.ds <= '1959-12-31']
Y_test_df = Y_df[Y_df.ds > '1959-12-31']
horizon = len(Y_test_df)

 

  • Y_dfAirPassengersDF(航空旅客数の時系列データセット)を代入しています。
  • Y_train_dfY_df から1959年12月31日までのデータをトレーニング用データセットとして選択しています。これは、特定の日付を基準にデータを分割しています。
  • Y_test_dfY_df から1959年12月31日より後のデータをテスト用データセットとして選択しています。このデータはモデルのパフォーマンスを評価する際に使用されます。
  • horizon はテストデータセット Y_test_df の長さ(データポイントの数)を示しています。これは、予測モデルが未来にどれだけ先まで予測するかを示します。

 

学習データで、複数の時系列深層学習アルゴリズムを用いて予測モデルを構築します。

以下、コードです。

# 共通パラメータの定義
common_params = {
    'input_size': 2 * horizon, 
    'h': horizon, 
    'max_steps': 50, 
}

# モデルのインスタンス
model_types = [RNN, LSTM, GRU, NBEATS, NHITS, PatchTST]
models = [model_type(**common_params) for model_type in model_types]
nf = NeuralForecast(models=models, freq='M')

# モデルの学習
nf.fit(df=Y_train_df)

 

  • 共通パラメータの定義:
    • common_params という名前の辞書を作成し、複数の時系列予測モデルに共通するパラメータを定義しています。
    • input_size はモデルの入力サイズを設定し、2 * horizon としています。ここで horizon は以前に定義されたテストデータセットの長さを指します。
    • h は予測の水平線(予測する期間の長さ)を示し、horizon の値を使用しています。
    • max_steps はモデルのトレーニング中の最大ステップ数を指定し、ここでは50に設定されています。
  • モデルのインスタンス:
    • model_types というリストを作成し、RNN, LSTM, GRU, NBEATS, NHITS, PatchTST などの異なる時系列予測モデルクラスを含めています。
    • models リストを生成し、リスト内包表記を使用して model_types に含まれる各モデルクラスに common_params のパラメータを適用しています。
    • NeuralForecast クラスを使用して、複数のモデルを含む時系列予測環境を作成しています。models=models は構築したモデルリストを、freq='M' はデータの頻度を月次と指定しています。
  • モデルの学習:
    • nf.fit メソッドを用いて、トレーニングデータセット Y_train_df を使用してモデルをトレーニングしています。

 

テストデータの予測を行い、結果をプロットします。精度評価指標としてMAPE、MAE、R2を出力します。

以下、コードです。

# 予測の実施
Y_hat_df = nf.predict().reset_index()
Y_hat_df = Y_test_df.merge(Y_hat_df, how='left', on=['unique_id', 'ds'])

# モデルのクラス名(文字列)のリストを作成
model_names = [model.__name__ for model in model_types]

# プロット
plot_df = pd.concat([Y_train_df, Y_hat_df]).set_index('ds')
fig, ax = plt.subplots(1, 1, figsize=(20, 7))
plot_df[['y'] + model_names].plot(ax=ax, linewidth=2) 

# 予測精度評価関数
def calculate_performance_metrics(y_true, y_pred):
    return {
        'MAE': mean_absolute_error(y_true, y_pred),
        'MAPE': mean_absolute_percentage_error(y_true, y_pred),
        'R2 Score': r2_score(y_true, y_pred)
    }

# 各モデルの予測精度評価
for model in model_names:
    y_true = Y_test_df['y']
    y_pred = Y_hat_df[model]

    metrics = calculate_performance_metrics(y_true, y_pred)
    print(f"Model: {model}")
    print(f"MAE: {metrics['MAE']}")
    print(f"MAPE: {metrics['MAPE']}")
    print(f"R2 Score: {metrics['R2 Score']}")
    print("\n")

 

  • 予測の実施:
    • nf.predict() でトレーニングされたモデルを使用して予測を行い、その結果のインデックスをリセットして Y_hat_df に格納します。
    • テストデータセット Y_test_df と予測結果 Y_hat_dfunique_idds(日付)を基準に左結合しています。
  • モデルのクラス名(文字列)のリスト作成:
    • model_types に含まれる各モデルのクラス名を取得し、model_names リストに格納します。
  • プロット:
    • トレーニングデータ Y_train_df と予測結果 Y_hat_df を結合し、日付 ds をインデックスに設定して plot_df に格納します。
    • matplotlibを使用して、実際の値 (y) と各モデルの予測値を折れ線グラフでプロットします。グラフのサイズは (20, 7) で、線の太さは 2 です。
  • 予測精度評価関数:
    • 実際の値と予測値に基づいて、MAE、MAPE、R2スコアを計算する関数 calculate_performance_metrics を定義します。
  • 各モデルの予測精度評価:
    • model_names リストを用いて各モデルのパフォーマンスを評価します。
    • テストデータセットから実際の値 (y_true) と予測値 (y_pred) を取得し、上述の関数を使用してパフォーマンス指標を計算します。
    • 各モデルのMAE、MAPE、R2スコアを出力します。

 

以下、実行結果です。

Model: RNN
MAE: 290.1596082051595
MAPE: 0.6006616601570595
R2 Score: -15.191620017057232


Model: LSTM
MAE: 152.82826487223306
MAPE: 0.3052812170571444
R2 Score: -4.270535668100463


Model: GRU
MAE: 94.60926055908203
MAPE: 0.18068904994438215
R2 Score: -1.6311675760853523


Model: NBEATS
MAE: 27.853612263997395
MAPE: 0.06133935936828425
R2 Score: 0.8174517724736398


Model: NHITS
MAE: 31.74469757080078
MAPE: 0.07192646322657587
R2 Score: 0.7056125855816267


Model: PatchTST
MAE: 20.82561492919922
MAPE: 0.043825312776846516
R2 Score: 0.8899272106906247

 

まとめ

NeuralForecastの簡易チュートリアルでは、ビジネスにおける時系列予測の実践的な適用を示しました。

Pythonを用いて、NeuralForecastをインストールし、比較的古典的な時系列深層学習であるRNNから、最先端の時系列トランスフォーマーであるPatchTSTの幾つかの時系列深層学習モデルで、AirPassengersデータセットの時系列予測を行い、その結果を視覚化しました。

このプロセスは、ビジネスにおけるデータ駆動型の意思決定をサポートし、より正確な予測を実現するための実用的な基盤を提供します。

深層学習によるビジネス時系列分析ツール NeuralForecast(3)– 時系列回帰モデルを深層学習で構築する方法 –