NeuralProphetで時系列データ予測
はじめに
時系列データ予測ができるNeuralProphetについて、基本的な使い方を解説したいと思います。
NeuralProphetとは
NeuralProphetは、ProphetとAR-Netという自己回帰型のニューラルネットワークモデルを元にした時系列データ予測モデルになります。
Prophetについては、下記の記事で解説しています。
Prophetで時系列データ予測
<script async="" src="https://cdnjs.cloudflare.co
使い方や特徴はProphetと似ており、トレンドや周期性などから予測をし、予測したコンポーネントの可視化もできます。
基本的な使い方
NeuralProphetの基本的な使い方を紹介していきます。
ここではAirline Passengersのデータを利用します。今回はkaggleでアップされていたデータを利用しています。
Air Passengers
Number of air passengers per month
インストール
まずはNeuralProphetをインストールします。
1pip install NeuralProphet
準備
必要なライブラリをインポートしておきます。
1import pandas as pd
2from neuralprophet import NeuralProphet
3
4import seaborn as sns
5sns.set()
利用データ
利用するデータを読み込みます。
1data = 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 |
どのようなデータか可視化してみます。
1sns.lineplot(x="Month", y="#Passengers", data=data)
学習データの準備
学習データの準備をしていきます。
NeuralProphettは、Prophet同様に学習させるデータは時系列を表すds
カラムと予測する対象となるy
カラムが必要になります。
データの形としては今のままでいいですが、カラム名が適切ではないので、カラム名の変更をします。
1data.columns = ['ds', 'y']
また、学習データとテストデータを分割します。ここでは、最後の12ヶ月をテストデータとしています。
1test_length = 12
2train = data.iloc[:-test_length]
3test = data.iloc[-test_length:]
学習
学習データの準備ができたので、モデルの学習をします。
1model = NeuralProphet(
2 seasonality_mode='multiplicative',
3 yearly_seasonality=True,
4 weekly_seasonality=False,
5 daily_seasonality=False,
6 epochs=1000
7)
8model.fit(train, freq='M')
fit
を実行する時はデータのステップの大きさを指定します。今回のデータは1ヶ月ごとの月末のデータのためM
としています。
Time series / date functionality — pandas 2.2.3 documentation
パラメータ
Prophetと同様にモデルではいくつかのパラメータが設定可能です。AR-Net向けのパラメータもあります。
下記でパラメータの設定ができます。設定している値は全てデフォルト値になります。
1params = {'growth': 'linear',
2 'changepoints': None,
3 'n_changepoints': 10,
4 'changepoints_range': 0.9,
5 'trend_reg': 0,
6 'trend_reg_threshold': False,
7 'yearly_seasonality': 'auto',
8 'weekly_seasonality': 'auto',
9 'daily_seasonality': 'auto',
10 'seasonality_mode': 'additive',
11 'seasonality_reg': 0,
12 'n_forecasts': 1,
13 'n_lags': 0,
14 'num_hidden_layers': 0,
15 'd_hidden': None,
16 'ar_sparsity': None,
17 'learning_rate': None,
18 'epochs': None,
19 'batch_size': None,
20 'loss_func': 'Huber',
21 'train_speed': None,
22 'normalize': 'auto',
23 'impute_missing': True
24}
25model = NeuralProphet(**params)
予測
学習が完了したらテストデータで予測してみます。
make_future_dataframe
で学習データの期間にテストデータ(未来のデータ)を追加したDataFrameを作成します。
1future = model.make_future_dataframe(train, periods=test_length, n_historic_predictions=len(train))
作成したデータで予測します。
1pred = 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 |
可視化
予測した結果を可視化します。
黒い点が学習データの実際の値になります。
1pred_plot = model.plot(pred)
plot_components
を使うとトレンドや周期性の可視化もできます。
1component_plot = model.plot_components(pred)
参考
- Quickstart - NeuralProphet
- ourownstory/neural_prophet: NeuralProphet - A simple forecasting model based on Neural Networks in PyTorch