Prophet 1.0 : 非日次データ (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 07/14/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 : 非日次データ
Sub-daily データ
Prophet は ds カラムでタイムスタンプを持つデータフレームを渡すことにより sub-daily 観測をもつ時系列のために予測を行なうことができます。タイムスタンプの形式は YYYY-MM-DD HH:MM:SS であるべきです – ここ のサンプル csv を見てください。sub-daily データが使用されるとき、daily 季節性は自動的に適合されます。ここでは Prophet を 5 分解像度のデータに適合させます (Yosemite の daily 気温) :
df = pd.read_csv('../examples/example_yosemite_temps.csv')
m = Prophet(changepoint_prior_scale=0.01).fit(df)
future = m.make_future_dataframe(periods=300, freq='H')
fcst = m.predict(future)
fig = m.plot(fcst)
daily 季節性は成分プロットに現れます :
fig = m.plot_components(fcst)
規則的なギャップ (= regular gap) を持つデータ
上のデータセットは 12a から 6a までの観測だけを持ったと仮定します :
df2 = df.copy()
df2['ds'] = pd.to_datetime(df2['ds'])
df2 = df2[df2['ds'].dt.hour < 6]
m = Prophet().fit(df2)
future = m.make_future_dataframe(periods=300, freq='H')
fcst = m.predict(future)
fig = m.plot(fcst)
予測は非常に貧弱のようで、履歴で見られたものよりも未来は遥かに大きな上下動を持ちます。ここでの問題は 1 日の一部 (12a to 6a) のためのデータだけを持つ daily サイクルを時系列に適合させたことです。そのため daily 季節性は 1 日の残りのために制約されずに上手く推定されません。解法は履歴データがある時間帯のためだけに予測を行なうことです。ここでは、それは未来のデータフレームを 12a から 6a の時間に制限することを意味します。
future2 = future.copy()
future2 = future2[future2['ds'].dt.hour < 6]
fcst = m.predict(future2)
fig = m.plot(fcst)
同じ原理はデータに規則的なギャップを持つ他のデータセットに適用されます。例えば、履歴が平日だけを含む場合、予測は平日のためだけに行なわれるべきです、何故ならば weekly 季節性は週末のためには上手く推定されないからです。
月次 (= Monthly) データ
Prophet を月次データに適合させるために利用できます。けれども、基礎的なモデルは連続時間です、これはモデルを月次データに適合させて日次予測を求める場合、奇妙な結果を得る可能性があることを意味します。ここでは次の 10 年間の US 小売販売量を予測します :
df = pd.read_csv('../examples/example_retail_sales.csv')
m = Prophet(seasonality_mode='multiplicative').fit(df)
future = m.make_future_dataframe(periods=3652)
fcst = m.predict(future)
fig = m.plot(fcst)
これはデータセットが定期的なギャップを持つ、上記と同じ問題です。yearly 季節性に適合させるとき、それは各月の最初のためのデータだけを持ち残りの日のための季節性成分は識別できずに過剰適合になります。これは季節性の不確実性を見るために MCMC を行なうことにより明瞭に見ることができます :
m = Prophet(seasonality_mode='multiplicative', mcmc_samples=300).fit(df)
fcst = m.predict(future)
fig = m.plot_components(fcst)
WARNING:pystan:481 of 600 iterations saturated the maximum tree depth of 10 (80.2 %) WARNING:pystan:Run again with max_treedepth larger than 10 to avoid saturation
季節性はデータポイントがある各月の最初では低い不確実性を持ちますが、その間は非常に高い事後分散を持ちます。Prophet を月次データに適合させるとき、月次予測だけを行ないます、これは頻度を make_future_dataframe に渡すことにより成されます :
future = m.make_future_dataframe(periods=120, freq='MS')
fcst = m.predict(future)
fig = m.plot(fcst)
Python では、頻度はここの頻度文字列の pandas リストからのどれでもかまいません : https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases 。ここで使用される MS は month-start であることに注意してください、データポイントが各月の最初に配置されることを意味します。
月次データでは、yearly 季節性は二値 extra リグレッサーでもモデル化できます。特に、モデルは is_jan, is_feb 等のような 12 個の extra リグレッサーを使用できます、ここで is_jan は日付が 1 月であれば 1 をそうでなければ 0 です。このアプローチは上で見られた月内の (= within-month) 識別不能性 (= unidentifiability) を回避するでしょう。月次 extra リグレッサーが追加される場合 yearly_seasonality=False を確実に使用してください。
集計データによる休日
休日効果は休日が指定された特定の日付に適用されます。weekly or monthly 頻度で集計されるデータでは、データで使用される特定の日付にはまらない休日は無視されます : 例えば、各データポイントが日曜日にある weekly 時系列の月曜日の休日です。モデルに休日効果を含めるには、休日は効果が望まれる履歴データフレームの日付に移動される必要があります。weekly or monthly 集計データでは、多くの休日効果は yearly 季節性で上手く捕捉されますので、追加された休日は時系列を通して異なる週に発生する休日のためだけに必要かもしれないことに注意してください。
以上