YUTO-Wの日記

美容と健康のためのブログです(`・ω・´) #ビタミンC #健康志向 #機械学習 #AI #ロボット #ROS

NeuralProphetによる多変量解析の実装方法

【目的】

NeuralProphetによる多変量解析を行う方法についてまとめる。

 

【背景】

時系列データのAI予測モデルとして「NeuralProphet」がある。

NeuralProphetのポイント:

 ・Facebookが公開しているProphetにDeep Learningの技術を組合せたもの

 ・2017年リリース

 ・時系列解析ライブラリ

 ・GitHubは以下URL参照

  https://neuralprophet.com/html/index.html

 

Web上には様々な情報がある。

例えば以下ページでは、単変量での実装方法が紹介されている。

NeuralProphetを使ってみた - Qiita

しかし、多変量での実装に関する情報がWeb上にほぼ無い。(見つけられない。)

そのため、本ブログでまとめる。

 

【内容】

AWS SageMakerで実装する。以下コマンドで neuralprophet インストール可能。

!pip install neuralprophet

 

ライブラリのimport。

# NeuralProphet
from neuralprophet import NeuralProphet

 

データ読み込み。PandasのDataFrameとする。

df = pd.read_csv("***.csv")

※dfには、"time", "power", "fire", "thunder" 列があるとする。

 

NeuralProphetで予測するためには、

"ds"(タイムスタンプ)と "y"(推論対象)の列が必須。

そのため、リネームして対応する。

例えば、"time"(タイムスタンプ) と "power"(推論対象)の列がある場合は以下。

df = df.rename(columns={"time": "ds", "power":"y"})

 

テストデータ分割。テストデータ数は適宜変更する。

# 学習データとテストデータの分割
test_length = 50 #テストデータ数
df_train = df.iloc[:-test_length] #学習用
df_test = df.iloc[-test_length:] #評価用

 

NeuralProphetのパラメータを適切に設定。例えば、以下のようにする。

params = {
    "yearly_seasonality": False,
    "weekly_seasonality": False,
    "daily_seasonality": False,
    "normalize": "standardize", #標準化指定
    "global_normalization": False, #全体の中央値を一致させるかどうか
}

 

ここからが多変量でのポイント。

future_regressors_df で使用する変数を指定する。

以下のコードは、"fire" と "thunder" を説明変数として追加したもの。

future_regressors_df = pd.DataFrame(data={
                                          'fire': df['fire'][:-test_length],
                                          'thunder': df['thunder'][:-test_length]
                                         })

 

NeuralProphetモデル構築。

model = NeuralProphet(**params)

 

構築したモデルに対し、説明変数追加。

normalize="true" で、追加した説明変数の標準化が可能。

model = model.add_future_regressor(name='fire', normalize="true")
model = model.add_future_regressor(name='thunder', normalize="true")

 

モデルに関するその他設定。

# 使用するデータフレーム、推論頻度等の設定
metrics = model.fit(df, freq='1min', progress="bar")

 

精度検証用のデータ生成。test_lengthで指定した期間が、実際の評価期間になる。

# NeuralProphet 予測モデルの精度検証用データの生成
# 未来の時刻を含むデータフレームを作成
# make_future_dataframe の使い方は鬼ムズ(Webにほとんど情報が無い)
future = model.make_future_dataframe(
    df_train,
    regressors_df=future_regressors_df,
    periods=test_length,
    n_historic_predictions=len(df_train)
)

 

予測(推論)する。

# futureにはdf_trainの期間も含まれる
pred = model.predict(future)

 

予測結果の可視化。点は実測値。

# NeuralProphet 予測モデルの予測結果(学習データ期間+テストデータ期間)
pred_plot = model.plot(pred)  # 予想値(点は学習データの実測値)
component_plot = model.plot_components(pred)  # モデルの要素分解

f:id:yutow0403:20220408153812p:plain

NeuralProphet予測結果 可視化

 

精度評価のため、テストデータに予測値を結合。

# テストデータに予測値を結合
df_test["NeuralProphet Predict"] = pred.iloc[-test_length:].loc[:, "yhat1"]

 

精度算出。

評価には、平均絶対誤差(MAE:Mean Absolute Error)を用いる。

# NeuralProphet 予測モデルの精度検証(テストデータ期間)
print("MAE(NeuralProphet):") #平均絶対誤差(MAE:Mean Absolute Error)
print(mean_absolute_error(df_test["y"], df_test["NeuralProphet Predict"]))

  MAE(NeuralProphet):
  36.52580529385156

 

以上で、NeuralProphetによる多変量解析は可能である。

 

【まとめ】

NeuralProphetで多変量を扱う場合についてまとめた。

機械学習に限らず、最新の情報は日本語文献が少ない。

もっと英語を勉強しなくては。。