Prophet は Facebook が開発した時系列予測アルゴリズムです。このアルゴリズムは、時系列をトレンド、季節性、休日効果の各要素に分解し、予測値とその不確実性の範囲を生成します。Prophet は需要計画、収益予測、トラフィック予測など、ビジネスにおける予測シナリオに適しています。
Prophet は MaxCompute コンピューティングリソース上でのみ実行されます。
Prophet の適用範囲
Prophet は、以下の条件のほとんどを満たすデータに対して最良の結果をもたらします。
少なくとも 2 つの完全な季節サイクル分の既存データ(例:日次観測データが 2 年分)
明確な季節パターン(日次、週次、年次)
時系列に影響を与えることがわかっている一過性のイベント(プロダクトローンチ、祝日、キャンペーンなど)
自然な上限または下限に近づく成長トレンド(例:市場飽和)
上記の特徴がまったくないデータの場合は、よりシンプルなモデルでも同程度の性能を発揮する可能性があります。
仕組み
MTable Assembler コンポーネントを使用して、時系列データを MTable 列にロードします。
MTable 列を Prophet コンポーネントに渡し、予測パラメーターを設定します。
Prophet は時系列をトレンド、季節性、休日効果の各要素に分解し、予測を生成します。
出力には、予測列に点予測 (
yhat)、予測詳細列に不確実性の範囲 (yhat_lower、yhat_upper) が含まれます。
PAI コンソールでのコンポーネント設定
入力ポート
| 入力ポート | データの型 | 必須 | 推奨される上流コンポーネント |
|---|---|---|---|
| Input Data | 該当なし | はい | テーブルの読み込み、CSV ファイルの読み込み、特徴量エンジニアリング、データ前処理 |
フィールド設定
| パラメーター | 説明 |
|---|---|
| valueCol | 時系列を含む MTable 列。データの型は STRING、データ形式は MTable です。この列は MTable Assembler コンポーネントを使用して構築します。Datetime 列 (ds) が時間軸として使用されます。例:{"data":{"ds":["2019-05-07 00:00:00.0","2019-05-08 00:00:00.0"],"val":[8588.0,8521.0]},"schema":"ds TIMESTAMP,val DOUBLE"} |
| reservedCols | 入力データから出力へ引き継ぐ列。 |
パラメーター設定
パラメーターは、トレンド制御、季節性制御、休日制御、出力および推論制御の 4 つのグループに分類されます。どのグループに属するかを理解することで、調整が容易になります。
トレンド制御
| パラメーター | デフォルト | 説明 |
|---|---|---|
| growth | LINEAR | 成長トレンドのタイプ。LINEAR は区分線形トレンドを当てはめます。Logistic は飽和する成長曲線を当てはめます。時系列に自然な上限または下限がある場合に使用します(cap および floor を適切に設定してください)。Flat はトレンドがないことを前提とします。 |
| cap | — | 上限の飽和値。growth が Logistic の場合に必須です。定数または時間とともに変化する系列のいずれかを指定できます。growth が LINEAR または Flat の場合は効果がありません。 |
| floor | — | 下限の飽和値。growth が Logistic で、かつ時系列に最小値の制約がある場合に必須です。growth が LINEAR または Flat の場合は効果がありません。 |
| changepoints | — | 変化点の日付を明示的にカンマ区切りで指定します。例:2021-05-02,2021-05-07。空白のままにすると、Prophet が自動的に変化点を検出します。 |
| n_change_point | 25 | 自動検出される変化点の最大数。 |
| change_point_range | 0.8 | 変化点が発生可能な既存データの割合。デフォルト (0.8) では、系列の最初の 80% の範囲に検出が制限され、データ末尾付近での誤った変化点の検出を防ぎます。 |
| changepoint_prior_scale | 0.05 | トレンドの柔軟性を制御します。トレンドが過学習(ノイズに過剰に追従)している場合は、この値を 0.001 に向けて小さくしてください。逆にトレンドが未学習(実際の変化を見逃している)場合は、0.5 に向けて大きくしてください。 |
季節性制御
| パラメーター | デフォルト | 説明 |
|---|---|---|
| seasonality_mode | ADDITIVE | 季節性がトレンドとどのように相互作用するかを指定します。季節的な変動の大きさが概ね一定の場合は ADDITIVE を使用します。季節的な変動の大きさがトレンドのレベルに比例して増減する場合は MULTIPLICATIVE を使用します。 |
| daily_seasonality | auto | 日次の季節成分を当てはめるかどうか。auto は、データに日次未満の観測が含まれる場合にのみ日次の季節性を有効にします。 |
| weekly_seasonality | auto | 週次の季節成分を当てはめるかどうか。 |
| yearly_seasonality | auto | 年次の季節成分を当てはめるかどうか。 |
| seasonality_prior_scale | 10.0 | 季節性がデータにどれだけ強く適合するかを制御します。季節的な変動を滑らかにするには値を小さくし、大きな季節変動を許容するには値を大きくします。changepoint_prior_scale と同様の働きをしますが、季節性成分に適用されます。 |
休日制御
| パラメーター | デフォルト | 説明 |
|---|---|---|
| holidays | — | カスタム休日の日付を 名前:日付1,日付2 名前2:日付3,日付4 の形式で指定します。複数の休日はスペースで区切ります。例:playoff:2021-05-03,2021-01-03 superbowl:2021-02-07,2021-11-02。 |
| holidays_prior_scale | 10.0 | 休日効果のモデルへの適合強度を制御します。seasonality_prior_scale と同様の働きをしますが、休日成分に適用されます。休日の急騰が過学習されている場合は値を小さくしてください。 |
出力および推論制御
| パラメーター | デフォルト | 説明 |
|---|---|---|
| predictionCol | — | 点予測 (yhat) を含む出力列の名前。 |
| predictionDetailCol | — | 予測詳細を MTable 形式で含む出力列の名前。フィールドには、不確実性の範囲 (yhat_lower、yhat_upper)、trend、および季節成分の値が含まれます。MTable Expander コンポーネントを使用して、この列を標準テーブルに展開できます。 |
| predictNum | 12 | 予測する将来の期間数。有効値:(0, inf)。 |
| include_history | — | 出力に既存の日付に対する適合値を含めるかどうか。 |
| interval_width | 0.8 | 不確実性区間の幅。デフォルトの 0.8 は、予測値を中心とした 80% の不確実性区間に対応します。 |
| mcmc_samples | 100 | ベイズ推論に使用するマルコフ連鎖モンテカルロ (MCMC) サンプル数。0 を設定すると、完全なベイズ推論の代わりに事後確率最大化 (MAP) 推定が使用されます。これにより処理は高速化されますが、不確実性区間は生成されません。 |
| uncertaintySamples | 1000 | 不確実性の範囲を計算するために使用するサンプル数。0 を設定すると、不確実性の推定をスキップして予測を高速化できます。 |
| stanInit | — | Stan オプティマイザーの初期値。空白のままにするとデフォルト値が使用されます。 |
| numThreads | — | コンポーネントが使用するスレッド数。 |
実行チューニング
| パラメーター | 説明 |
|---|---|
| Number of Workers | CPU コア数。[1, 9999] の範囲内の正の整数である必要があります。Memory per worker, unit MB と併せて設定します。 |
| Memory per worker, unit MB | 各ワーカーノードに割り当てるメモリ量。有効値:1024~65536 MB。 |
コードによるコンポーネント設定
次のコードを PyAlink Script コンポーネントにコピーして、Prophet コンポーネントの動作をプログラムで再現できます。
このコードは以下の 3 つのステップを実行します。
GroupByBatchOpを使用して、生の時系列行をグループごとに単一の MTable 列に集約します。ProphetBatchOpを使用して、各 MTable に対して Prophet 予測を実行します。FlattenMTableBatchOpを使用して、MTable 形式の予測出力を標準テーブルに展開します。
import time, datetime
import numpy as np
import pandas as pd
# 必要な Prophet プラグイン環境をダウンロード
downloader = AlinkGlobalConfiguration.getPluginDownloader()
downloader.downloadPlugin('tf115_python_env_linux')
# サンプル入力:各行が 1 つのタイムスタンプ付き観測値
data = pd.DataFrame([
[1, datetime.datetime.fromtimestamp(1), 10.0],
[1, datetime.datetime.fromtimestamp(2), 11.0],
[1, datetime.datetime.fromtimestamp(3), 12.0],
[1, datetime.datetime.fromtimestamp(4), 13.0],
[1, datetime.datetime.fromtimestamp(5), 14.0],
[1, datetime.datetime.fromtimestamp(6), 15.0],
[1, datetime.datetime.fromtimestamp(7), 16.0],
[1, datetime.datetime.fromtimestamp(8), 17.0],
[1, datetime.datetime.fromtimestamp(9), 18.0],
[1, datetime.datetime.fromtimestamp(10), 19.0]
])
# ステップ 1: 行をシリーズ ID ごとにグループ化して MTable 列に変換
source = dataframeToOperator(data, schemaStr='id int, ts timestamp, val double', op_type='batch')
source.link(
GroupByBatchOp()
.setGroupByPredicate("id")
.setSelectClause("id, mtable_agg(ts, val) as data")
# ステップ 2: Prophet を実行し、4 期間先を予測
).link(
ProphetBatchOp()
.setValueCol("data")
.setPredictNum(4)
.setPredictionCol("pred")
# ステップ 3: MTable 形式の予測出力を行に展開
).link(
FlattenMTableBatchOp()
.setSelectedCol("pred_detail")
.setSchemaStr("ds timestamp, yhat double")
).print()次のステップ
MTable Expander コンポーネントを使用して、
predictionDetailColの出力を標準テーブルに展開し、ダウンストリーム分析に利用します。利用可能なコンポーネントの概要については、「ビジュアルモデリングの概要」および「コンポーネントリファレンス: 全コンポーネントの概要」をご参照ください。