はじめに
時系列データ予測ができるNeuralProphetについて、基本的な使い方を解説したいと思います。
NeuralProphetとは
NeuralProphetは、ProphetとAR-Netという自己回帰型のニューラルネットワークモデルを元にした時系列データ予測モデルになります。
Prophetについては、下記の記事で解説しています。

使い方や特徴はProphetと似ており、トレンドや周期性などから予測をし、予測したコンポーネントの可視化もできます。
基本的な使い方
NeuralProphetの基本的な使い方を紹介していきます。
ここではAirline Passengersのデータを利用します。今回はkaggleでアップされていたデータを利用しています。

インストール
まずは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 | |
---|---|---|
0 | 1949-01 | 112 |
1 | 1949-02 | 118 |
2 | 1949-03 | 132 |
3 | 1949-04 | 129 |
4 | 1949-05 | 121 |
... | ... | ... |
139 | 1960-08 | 606 |
140 | 1960-09 | 508 |
141 | 1960-10 | 461 |
142 | 1960-11 | 390 |
143 | 1960-12 | 432 |
どのようなデータか可視化してみます。
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
としています。
パラメータ
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
カラムに予測した値があります。
ds | y | yhat1 | residual1 | trend | season_yearly | |
---|---|---|---|---|---|---|
0 | 1949-01-01 | 112 | 115.253517 | 3.253517 | 122.470558 | -0.128370 |
1 | 1949-02-01 | 118 | 113.283188 | -4.716812 | 123.430923 | -0.177467 |
2 | 1949-03-01 | 132 | 123.918053 | -8.081947 | 124.298355 | -0.006552 |
3 | 1949-04-01 | 129 | 122.280075 | -6.719925 | 125.258728 | -0.050478 |
4 | 1949-05-01 | 121 | 124.627258 | 3.627258 | 126.188110 | -0.026041 |
... | ... | ... | ... | ... | ... | ... |
139 | 1960-07-31 | None | 584.971497 | None | 459.532654 | 0.318953 |
140 | 1960-08-31 | None | 493.105011 | None | 462.200623 | 0.078051 |
141 | 1960-09-30 | None | 425.568817 | None | 464.782532 | -0.098395 |
142 | 1960-10-31 | None | 367.921875 | None | 467.450500 | -0.248077 |
143 | 1960-11-30 | None | 412.627258 | None | 470.032440 | -0.142169 |
可視化
予測した結果を可視化します。
黒い点が学習データの実際の値になります。
pred_plot = model.plot(pred)
plot_components
を使うとトレンドや周期性の可視化もできます。
component_plot = model.plot_components(pred)