- 製造業出身のデータサイエンティストがお送りする記事
- 今回は時系列解析手法のNeuralProphetを使ってみました
はじめに
過去に時系列解析に関しては何個か整理しておりますので、興味ある方は参照して頂けますと幸いです。
NeuralProphetとは
NeuralProphetとは、Facebookが公開しているProphetにDeep Learningの技術を組合せており、2017年にリリースされた時系列解析ライブラリです。Prophet同様に使いやすいです。
NeuralProphetの実装
今回も使用したデータは、月ごとの飛行機の乗客数データです。
最初にライブラリーをインストールしますが、pipで簡単にインストール可能です。
pip install neuralprophet
ここから、普通にライブラリーをインポートして行きます。
# ライブラリーのインポート
import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib import pylab as plt
%matplotlib inline
# NeuralProphet
from neuralprophet import NeuralProphet
# 評価指標
from sklearn.metrics import mean_absolute_error
import warnings
warnings.filterwarnings("ignore")
# https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/AirPassengers.html
df = pd.read_csv("../../data/AirPassengers.csv")
# float型に変換
df["#Passengers"] = df["#Passengers"].astype("float64")
df = df.rename(columns={"#Passengers": "Passengers"})
# datetime型に変換にする
df.Month = pd.to_datetime(df.Month)
# データの中身を確認
df.head()
fig, ax = plt.subplots()
a = sns.lineplot(x="Month", y="Passengers", data=df)
plt.show()
次に学習データとテストデータに分割します。
df = df.rename(columns={"Month": "ds", "Passengers": "y"})
df = df[["ds", "y"]]
# 学習データとテストデータの分割
test_length = 12
df_train = df.iloc[:-test_length]
df_test = df.iloc[-test_length:]
各種パラメータを下記のように設定できます。
params = {
"growth": "linear",
"changepoints": None,
"n_changepoints": 10,
"changepoints_range": 0.9,
"trend_reg": 0,
"trend_reg_threshold": False,
"yearly_seasonality": True,
"weekly_seasonality": False,
"daily_seasonality": False,
"seasonality_mode": "multiplicative",
"seasonality_reg": 0,
"n_forecasts": 1,
"n_lags": 0,
"num_hidden_layers": 0,
"d_hidden": None,
"ar_sparsity": None,
"learning_rate": None,
"epochs": 1000,
"batch_size": None,
"loss_func": "Huber",
"train_speed": None,
"normalize": "auto",
"impute_missing": True,
}
モデルを構築します。
model = NeuralProphet(**params)
model.fit(df_train,
validate_each_epoch=True,
valid_p=0.2,
freq='M',
plot_live_loss=True)
各種パラメータの意味合いは下記の通りです。
- validate_each_epoch:各エポックの検証データでモデルのパフォーマンスを検証するかどうか
- valid_p:検証に使用する必要があるデータの割合
- plot_live_loss:モデルのトレーニングと検証の損失のライブプロットを生成するかどうか
次に予測モデルの精度検証用データを生成します。
# NeuralProphet 予測モデルの精度検証用データの生成
future = model.make_future_dataframe(
df_train, periods=test_length, n_historic_predictions=len(df_train)
)
pred = model.predict(future)
予測結果は下記のように可視化できます。
# NeuralProphet 予測モデルの予測結果(学習データ期間+テストデータ期間)
pred_plot = model.plot(pred) # 予想値(点は学習データの実測値)
component_plot = model.plot_components(pred) # モデルの要素分解
最後に評価指標を算出します。
# テストデータに予測値を結合
df_test["NeuralProphet Predict"] = pred.iloc[-test_length:].loc[:, "yhat1"]
# NeuralProphet 予測モデルの精度検証(テストデータ期間)
print("MAE(NeuralProphet):")
print(mean_absolute_error(df_test["y"], df_test["NeuralProphet Predict"]))
#MAE(NeuralProphet):
#16.130884806315105
さいごに
最後まで読んで頂き、ありがとうございました。
今回は時系列解析手法のNeuralProphetを使ってみました。
訂正要望がありましたら、ご連絡頂けますと幸いです。