【目的】
NeuralProphetによる多変量解析を行う方法についてまとめる。
【背景】
時系列データのAI予測モデルとして「NeuralProphet」がある。
NeuralProphetのポイント:
・Facebookが公開しているProphetにDeep Learningの技術を組合せたもの
・2017年リリース
・時系列解析ライブラリ
・GitHubは以下URL参照
https://neuralprophet.com/html/index.html
Web上には様々な情報がある。
例えば以下ページでは、単変量での実装方法が紹介されている。
しかし、多変量での実装に関する情報がWeb上にほぼ無い。(見つけられない。)
そのため、本ブログでまとめる。
【内容】
AWS SageMakerで実装する。以下コマンドで neuralprophet インストール可能。
!pip install neuralprophet
ライブラリのimport。
# NeuralProphet
from neuralprophet import NeuralProphet
データ読み込み。PandasのDataFrameとする。
※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) # モデルの要素分解
精度評価のため、テストデータに予測値を結合。
# テストデータに予測値を結合
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で多変量を扱う場合についてまとめた。
機械学習に限らず、最新の情報は日本語文献が少ない。
もっと英語を勉強しなくては。。