NeuralProphetで時系列データ予測

スポンサーリンク

はじめに

時系列データ予測ができるNeuralProphetについて、基本的な使い方を解説したいと思います。

NeuralProphetとは

NeuralProphetは、ProphetとAR-Netという自己回帰型のニューラルネットワークモデルを元にした時系列データ予測モデルになります。

Prophetについては、下記の記事で解説しています。

Prophetで時系列データ予測
はじめに 時系列データを簡単に予測できるProphetについて、基本的な使い方と実際に使ってみた具体例を紹介したいと思います。 Prophetとは Prophetとは、Facebookが開発した時系列データの予測ができるライブラリです。 外...

使い方や特徴はProphetと似ており、トレンドや周期性などから予測をし、予測したコンポーネントの可視化もできます。

基本的な使い方

NeuralProphetの基本的な使い方を紹介していきます。

ここではAirline Passengersのデータを利用します。今回はkaggleでアップされていたデータを利用しています。

Air Passengers
Number of air passengers per month

インストール

まずはNeuralProphetをインストールします。

pip install NeuralProphet

準備

必要なライブラリをインポートしておきます。

import pandas as pd
from neuralprophet import NeuralProphet

import seaborn as sns
sns.set()

利用データ

利用するデータを読み込みます。

data = pd.read_csv('../input/air-passengers/AirPassengers.csv')

以下のような1949年1月から1960年12月の飛行機の乗客データになっています。

Month#Passengers
01949-01112
11949-02118
21949-03132
31949-04129
41949-05121
.........
1391960-08606
1401960-09508
1411960-10461
1421960-11390
1431960-12432

どのようなデータか可視化してみます。

sns.lineplot(x="Month", y="#Passengers", data=data)

学習データの準備

学習データの準備をしていきます。

NeuralProphettは、Prophet同様に学習させるデータは時系列を表すdsカラムと予測する対象となるyカラムが必要になります。

データの形としては今のままでいいですが、カラム名が適切ではないので、カラム名の変更をします。

data.columns = ['ds', 'y']

また、学習データとテストデータを分割します。ここでは、最後の12ヶ月をテストデータとしています。

test_length = 12
train = data.iloc[:-test_length]
test = data.iloc[-test_length:]

学習

学習データの準備ができたので、モデルの学習をします。

model = NeuralProphet(
    seasonality_mode='multiplicative',
    yearly_seasonality=True,
    weekly_seasonality=False,
    daily_seasonality=False,
    epochs=1000
)
model.fit(train, freq='M')

fitを実行する時はデータのステップの大きさを指定します。今回のデータは1ヶ月ごとの月末のデータのためMとしています。

Time series / date functionality — pandas 2.0.3 documentation

パラメータ

Prophetと同様にモデルではいくつかのパラメータが設定可能です。AR-Net向けのパラメータもあります。

下記でパラメータの設定ができます。設定している値は全てデフォルト値になります。

params = {'growth': 'linear',
          'changepoints': None,
          'n_changepoints': 10,
          'changepoints_range': 0.9,
          'trend_reg': 0,
          'trend_reg_threshold': False,
          'yearly_seasonality': 'auto',
          'weekly_seasonality': 'auto',
          'daily_seasonality': 'auto',
          'seasonality_mode': 'additive',
          'seasonality_reg': 0,
          'n_forecasts': 1,
          'n_lags': 0,
          'num_hidden_layers': 0,
          'd_hidden': None,
          'ar_sparsity': None,
          'learning_rate': None,
          'epochs': None,
          'batch_size': None,
          'loss_func': 'Huber',
          'train_speed': None,
          'normalize': 'auto',
          'impute_missing': True
}
model = NeuralProphet(**params)

予測

学習が完了したらテストデータで予測してみます。

make_future_dataframeで学習データの期間にテストデータ(未来のデータ)を追加したDataFrameを作成します。

future = model.make_future_dataframe(train, periods=test_length, n_historic_predictions=len(train))

作成したデータで予測します。

pred = model.predict(future)

yhat1カラムに予測した値があります。

dsyyhat1residual1trendseason_yearly
01949-01-01112115.2535173.253517122.470558-0.128370
11949-02-01118113.283188-4.716812123.430923-0.177467
21949-03-01132123.918053-8.081947124.298355-0.006552
31949-04-01129122.280075-6.719925125.258728-0.050478
41949-05-01121124.6272583.627258126.188110-0.026041
.....................
1391960-07-31None584.971497None459.5326540.318953
1401960-08-31None493.105011None462.2006230.078051
1411960-09-30None425.568817None464.782532-0.098395
1421960-10-31None367.921875None467.450500-0.248077
1431960-11-30None412.627258None470.032440-0.142169

可視化

予測した結果を可視化します。

黒い点が学習データの実際の値になります。

pred_plot = model.plot(pred)

plot_componentsを使うとトレンドや周期性の可視化もできます。

component_plot = model.plot_components(pred)

参考

タイトルとURLをコピーしました