10
19

More than 3 years have passed since last update.

NeuralProphetを使ってみた

Posted at
  • 製造業出身のデータサイエンティストがお送りする記事
  • 今回は時系列解析手法の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()

スクリーンショット 2020-12-05 12.41.18.png

fig, ax = plt.subplots()
a = sns.lineplot(x="Month", y="Passengers", data=df)
plt.show()

image.png

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

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:モデルのトレーニングと検証の損失のライブプロットを生成するかどうか

スクリーンショット 2021-08-12 10.37.55.jpg

次に予測モデルの精度検証用データを生成します。

# 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)  # モデルの要素分解

image.png
image.png

最後に評価指標を算出します。

# テストデータに予測値を結合
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を使ってみました。

訂正要望がありましたら、ご連絡頂けますと幸いです。

10
19
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
19