🧙‍♀️

NeuralProphet 先にあったことはまた後にもある 日の下で人が行うすべてのわざを見たがみな空であって風をとらえるようである

に公開

会社のブログを全部チェックしている人もいるらしいということを聞きましたので、
今回は真面目に哲学調なタイトルにしてみました。
出典はユダヤの古い書、コヘレトの言葉(מְגִילָת קֹהֶלֶת)です。(コヘレト=哲学者・伝道者)

新しいことが起きたとよく言いますが、紐解いていくと昔も同様のことがあり繰り返しているだけなのだというソロモン王の言葉です。
過去と同じ条件、同じ値になることは稀です。まさに風をとらえるようなものですが、分解された要素は繰り返し、法則 に従って動いているので、予測できるのです。
最近取り上げているprophetや今回取り上げるNeuralProphetは過去のデータをうまく要素に分解して未来を予測するというアルゴリズムです。

NeuralProphetとは?

https://zenn.dev/headwaters/articles/77fdcfc479f031
https://zenn.dev/headwaters/articles/e28ceabd8f28b3

上の記事で解説したProphetは、時系列データを扱う強力なアルゴリズムでした。
今回はその進化版である「NeuralProphet」を紹介します。

その名の通り、NeuralProphetはニューラルネットワークを活用してデータの性質を学習して、高度な時系列予測を実現します。
NeuralProphet公式ページ

さらに詳しく知りたい方は、以下の論文も参考にしてください:

NeuralProphetのモデル構造

NeuralProphetの予測モデルは以下のように表現されます:

\hat{y}_t = T(t) + S(t) + E(t) + F(t) + A(t) + L(t)

各項目の意味は次の通りです:

  • T(t) : トレンド (長期的な変化)
  • S(t) : 季節変動効果・周期効果 (Seasonal effects)
  • E(t) : 祝日やイベントなどの外部効果 (Event and holidays)
  • F(t) : 未来の外因性回帰効果 (Future-known exogenous variables)
  • A(t) : 自己回帰効果 (Autoregressive effects)
  • L(t) : 過去の外因性回帰効果 (Lagged observations of exogenous variables)

NeuralProphetはこれらの要素を組み合わせることで、従来の手法では捉えきれなかった複雑なパターンを学習し、より正確な予測を可能にします。

使い方

準備

installは簡単です

pip install neuralprophet

チュートリアルで使われているkaggleのデータを読み込みます。以降読み込んだdataframeのdfを使います。

import matplotlib.pyplot as plt
import pandas as pd

data_location = "https://raw.githubusercontent.com/ourownstory/neuralprophet-data/main/datasets/"

df = pd.read_csv(data_location + "wp_log_peyton_manning.csv")

指定なしの場合(周期性有、トレンド有)

季節性の指定はインスタンスを作る際の引数で行います。

m = NeuralProphet()
#m.set_plotting_backend("plotly-static")  # show plots correctly in jupyter notebooks
metrics = m.fit(df)
metrics.plot(x='epoch', grid=True)
plt.show()
print(metrics)

NeuralProphetは中で学習を行っているので、学習曲線を確認できます。

周期性無し変化点無しの場合

モデルの理解のためにあえて周期性なし変化点無しとして推定してみます。
周期性なし変化点なしということは1年間の動きも1週間内の動きもノイズとしてみるということです。
結果的に上昇傾向か下降傾向かという傾きだけ推定することになります。

周期性無し変化点有りの場合

変化点を入れてみました。変化点無しに比べて折れ線グラフになっているのがわかると思います。
変化点(changepoint)はそのままの意味で変化する点を推定します。点の数はデフォルトで10個と指定されているようです。

周期性あり変化点無し

今度は変化点推定をなくして、年の周期性のみの場合です。
全体的な上昇傾向と周期性でいい感じに推定できていますが、ずれはあります。
予測的にはこれだけでも結構いい気がします。

年の周期性の他、週(week)と日(day)の効果も入れてみます。
細かい動きが入るので線が太くなったように見えていますが、予測性能は上がっているはず。

周期性あり変化点あり

最後は全部載せ。
フィットしています。

予測する視点からいうと、変化点無しでもいいような気はしますが、変化点有りの場合の最後の線の傾きが予測のベースライン及び傾きになるので、ここが影響する場合が有り得ます。

まとめ

NeuraoProphetを使ってみました。
次は応用的な課題を扱った例を挙げていきたいと思います。

ヘッドウォータース

Discussion