Prophet 1.0 : 追加のトピック (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 07/16/2021 (1.0)
* 本ページは、Prophet の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
スケジュールは弊社 公式 Web サイト でご確認頂けます。
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- ウェビナー運用には弊社製品「ClassCat® Webinar」を利用しています。
人工知能研究開発支援 | 人工知能研修サービス | テレワーク & オンライン授業を支援 |
PoC(概念実証)を失敗させないための支援 (本支援はセミナーに参加しアンケートに回答した方を対象としています。) |
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション |
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/ ; Facebook |
Prophet 1.0 : 追加のトピック
モデルをセーブする
適合された Prophet モデルを後でロードして利用できるようにセーブすることは可能です。
Python では、モデルは pickle でセーブされるべきではありません ; モデルオブジェクトに装着される Stan バックエンドは上手く pickle しません、そして Python の特定のバージョンで問題が発生します。代わりに、モデルを json にシリアライズする組込みのシリアリゼーション関数を使用するべきです :
import json
from prophet.serialize import model_to_json, model_from_json
with open('serialized_model.json', 'w') as fout:
json.dump(model_to_json(m), fout) # Save model
with open('serialized_model.json', 'r') as fin:
m = model_from_json(json.load(fin)) # Load model
json ファイルはシステム間で可搬で、デシリアリゼーションは prophet の古いバージョンと後方互換です。
フラットなトレンドとカスタムトレンド
トレンド変化よりも強い季節性パターンを示す時系列については、トレンド成長率をフラットに強制することは有用かもしれません。これはモデルを作成するとき単純に growth=flat を渡すことにより実現されます :
m = Prophet(growth='flat')
これが定数トレンドを持たない時系列で使用される場合、任意のトレンドはノイズ項で適合されて従って予測で高い予測不確実性があることに注意してください。
これらの 3 つの組込みトレンド関数 (piecewise linear, piecewise logistic growth と flat) 以外のトレンドを使用するために、github からソースコードをダウンロードして、ローカルブランチで要望どおりトレンド関数を変更し、それからそのローカルバージョンをインストールできます。この PR はカスタム・トレンドを実装するために成されなければならないものの良い例を提供します、これ は step 関数 trend をそして これ は R で新しいトレンドを実装するものです。
適合されたモデルを更新する
予測の一般的な設定はモデルを適合させます、これは追加のデータが入ってくるとき更新される必要があります。Prophet モデルは一度だけ適合させることが可能で、新しいデータが利用可能になるとき新しいモデルが再適合されなければなりません。殆どの設定では、モデル適合はスクラッチから再適合することによるどのような問題もないほど十分に高速です。けれども、先のモデルのモデルパラメータから適合をウォームアップすることにより少しスピードアップすることは可能です。このコードサンプルは Python でこれがどのように成されるかを示します :
def stan_init(m):
"""Retrieve parameters from a trained model.
Retrieve parameters from a trained model in the format
used to initialize a new Stan model.
Parameters
----------
m: A trained model of the Prophet class.
Returns
-------
A Dictionary containing retrieved parameters of m.
"""
res = {}
for pname in ['k', 'm', 'sigma_obs']:
res[pname] = m.params[pname][0][0]
for pname in ['delta', 'beta']:
res[pname] = m.params[pname][0]
return res
df = pd.read_csv('../examples/example_wp_log_peyton_manning.csv')
df1 = df.loc[df['ds'] < '2016-01-19', :] # All data except the last day
m1 = Prophet().fit(df1) # A model fit to all data except the last day
%timeit m2 = Prophet().fit(df) # Adding the last day, fitting from scratch
%timeit m2 = Prophet().fit(df, init=stan_init(m1)) # Adding the last day, warm-starting from m1
1.33 s ± 55.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 185 ms ± 4.46 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
ご覧のように、前のモデルからのパラメータが kwarg init で次の (モデルの) ための適合に渡されます。この場合、ウォームスタートを使用するときモデル適合はおよそ 5x 高速でした。スピードアップは新しいデータの追加で最適なモデルパラメータがどの程度変化したかに一般に依存します。
ウォームスタートを考えるとき留意するべき幾つかの注意があります。最初に、ウォームアップスタートは (上のサンプルに 1 日を追加するような) データへの小さい更新のために上手く機能しますが、データへの大きな変更がある場合 (i.e., 多くの日付が追加される場合) スクラッチから適合させるよりも悪い可能性があります。これは履歴の大きあ総量が追加されるとき、変化点の位置が 2 つのモデル間で非常に異なり、従って前のモデルからのパラメータは実際には悪いトレンド初期化を生成するかもしれないからです。2 番目に、詳細として、changepoints の数は一つのモデルから次のモデルへ一貫している必要があります、そうでなければエラーが上げられます、何故ならば changepoint prior パラメータ delta が誤ったサイズになるからです。
外部リファレンス
これらの github レポジトリは幅広い関心があるかもしれない方法で Prophet の上に構築するサンプルを提供します :
- forecastr : Prophet のための UI を提供する web app。
- NeuralProphet : pytorch で実装された Prophet スタイルのモデル、より適応可能で拡張可能です。
以上