Prophet は Meta が管理する予測モデルです。アルゴリズムの詳細については、Prophet の論文をご覧ください。ライブラリの詳細については、ドキュメントをご覧ください。
BigQuery ML ARIMA_PLUS と同様に、Prophet は各時系列をトレンド、シーズン、祝日に分解し、モデルの予測の集計を使用して予測を生成します。ただし、重要な違いもあります。BQML ARIMA+ は ARIMA を使用してトレンド コンポーネントをモデル化するのに対し、Prophet は区分的ロジスティックまたは線形モデルを使用してカーブ フィッティングを行う点です。
Google Cloud には、Prophet モデルをトレーニングするためのパイプラインと、Prophet モデルからバッチ予測を取得するためのパイプラインが用意されています。どちらのパイプラインも、Google Cloud パイプライン コンポーネント(GCPC)の Vertex AI Pipelines のインスタンスです。
Prophet と Vertex AI の統合により、次のことが可能になります。
- Vertex AI のデータ分割とウィンドウ処理戦略を使用する。
- BigQuery テーブルまたは Cloud Storage に保存されている CSV からデータを読み取る。Vertex AI では、各行の形式が Vertex AI Forecasting と同じ形式であることを前提としています。
Prophet は多変量モデルですが、Vertex AI がサポートするのは単変量モデルのみです。
このワークフローで使用されるサービス アカウントについては、表形式ワークフローのサービス アカウントをご覧ください。
ワークフローの API
このワークフローでは、次の API を使用します。
- Vertex AI
- Dataflow
- BigQuery
- Cloud Storage
Prophet を使用してモデルをトレーニングする
Prophet は、単一の時系列向けに設計されています。Vertex AI は、時系列 ID でデータを集計し、時系列ごとに Prophet モデルをトレーニングします。モデル トレーニング パイプラインは、グリッド検索と Prophet の組み込みバックテスト ロジックを使用して、ハイパーパラメータ チューニングを実行します。
複数の時系列をサポートするために、パイプラインは Vertex AI のカスタム トレーニング ジョブと Dataflow を使用して、複数の Prophet モデルを並行してトレーニングします。全体として、トレーニングされるモデルの数は時系列の数とハイパーパラメータ チューニングの試行回数の積になります。
次のサンプルコードは、Prophet モデル トレーニング パイプラインの実行方法を示しています。
job = aiplatform.PipelineJob(
...
template_path=train_job_spec_path,
parameter_values=train_parameter_values,
...
)
job.run(service_account=SERVICE_ACCOUNT)
job.run()
でオプションの service_account
パラメータを使用すると、Vertex AI Pipelines サービス アカウントを任意のアカウントに設定できます。
パイプラインとパラメータ値は次の関数で定義されます。
(
train_job_spec_path,
train_parameter_values,
) = utils.get_prophet_train_pipeline_and_parameters(
...
)
get_prophet_train_pipeline_and_parameters
パラメータのサブセットは次のとおりです。
パラメータ名 | 型 | 定義 |
---|---|---|
project |
文字列 | 実際のプロジェクト ID |
location |
文字列 | 実際のリージョン |
root_dir |
文字列 | 出力を保存する Cloud Storage のロケーション。 |
target_column |
文字列 | このモデルに予測させる列(値)。 |
time_column |
文字列 | 時間列。時間列を指定する必要があります。すべての行に値が入っている必要があります。時間列は、特定の観測が行われた時刻を示します。 |
time_series_identifier_column |
文字列 | 時系列識別子の列。時系列識別子列を指定する必要があります。すべての行に値が入っている必要があります。通常、予測のトレーニング データには複数の時系列が含まれます。この識別子は、トレーニング データの特定の観測値が属する時系列を Vertex AI に指示します。特定の時系列内のすべての行は、時系列識別子列の値が同じになります。一般的な時系列識別子としては、商品 ID、店舗 ID、地域などがあります。1 つの時系列で、時系列識別子列のすべての行に同一の値を使用して予測モデルをトレーニングすることもできます。ただし、Vertex AI は 2 つ以上の時系列を含むトレーニング データに適しています。最適な結果を得るには、モデルのトレーニングに使用する列ごとに少なくとも 10 個の時系列を使用します。 |
data_granularity_unit |
文字列 | トレーニング データの粒度、予測ホライズン、コンテキスト ウィンドウに使用する単位。minute 、hour 、day 、week 、month 、year のいずれかです。詳しくは、データの粒度を選択する方法をご覧ください。 |
data_source_csv_filenames |
文字列 | Cloud Storage に保存されている CSV の URI。 |
data_source_bigquery_table_path |
文字列 | BigQuery テーブルの URI。 |
forecast_horizon |
整数 | 予測ホライズンでは、予測データの各行のターゲット値について、モデルがどの程度の未来の期間を予測するかが決まります。予測ホライズンは、データ粒度の単位で指定されます。詳細 |
optimization_objective |
文字列 | モデルの最適化目標。詳細 |
max_num_trials |
整数 | 時系列ごとに実行するチューニングの最大試行数。 |
Dataflow パラメータ
以下は、Dataflow のカスタマイズの get_prophet_train_pipeline_and_parameters
パラメータのサブセットです。
パラメータ名 | 型 | 定義 |
---|---|---|
trainer_dataflow_machine_type |
文字列 | トレーニングに使用する Dataflow マシンタイプ。 |
trainer_dataflow_max_num_workers |
整数 | トレーニングに使用する Dataflow ワーカーの最大数。 |
evaluation_dataflow_machine_type |
文字列 | 評価に使用する Dataflow マシンタイプ。 |
evaluation_dataflow_max_num_workers |
整数 | 評価に使用する Dataflow ワーカーの最大数。 |
dataflow_service_account |
文字列 | Dataflow ジョブを実行するカスタム サービス アカウント。プライベート IP と特定の VPC サブネットを使用するように Dataflow ジョブを構成できます。このパラメータは、デフォルトの Dataflow ワーカー サービス アカウントのオーバーライドとして機能します。 |
Prophet トレーニング ジョブは Dataflow で実行されるため、最初の起動時間は 5~7 分です。追加のランタイムを減らすには、スケールアップまたはスケールアウトを行います。たとえば、スケールアップするには、マシンタイプを n1-standard-1
から e2-highcpu-8
に変更します。スケールアウトするには、ワーカー数を 1
から 200
に増やします。
データ分割パラメータ
トレーニング パイプラインには、次のデータ分割オプションがあります。
データ分割 | 説明 | パラメータ |
---|---|---|
デフォルト分割 | Vertex AI はトレーニング データの 80% をトレーニング セット、10% を検証セット、10% をテストセットにランダムに選択します。Vertex AI は、時間列を使用してデータ行の時系列を判断します。 | なし |
部分分割 | Vertex AI は、提供された値を使用してデータをトレーニング セット、検証セット、テストセットに分割します。Vertex AI は、時間列を使用してデータ行の時系列を判断します。 |
|
タイムスタンプ分割 | Vertex AI は、training_fraction 、validation_fraction 、test_fraction の値を使用して、トレーニング セット、検証セット、テストセットにデータを分割します。Vertex AI は、timestamp_split_key 列を使用してデータ行の時系列を判断します。 |
|
手動(事前定義)分割 | Vertex AI は、predefined_split_key 列の TRAIN、VALIDATE、または TEST の値を使用してデータを分割します。 |
|
get_prophet_train_pipeline_and_parameters
でデータ分割パラメータを次のように定義します。
パラメータ名 | 型 | 定義 |
---|---|---|
predefined_split_key |
文字列 | TRAIN、VALIDATE、または TEST の値を含む列の名前。手動(事前定義)分割を使用する場合は、この値を設定します。 |
training_fraction |
浮動小数点数 | トレーニング セットに割り当てるデータの割合。部分分割またはタイムスタンプ分割を使用する場合は、この値を設定します。 |
validation_fraction |
浮動小数点数 | 検証セットに割り当てるデータの割合。部分分割またはタイムスタンプ分割を使用する場合は、この値を設定します。 |
test_fraction |
浮動小数点数 | テストセットに割り当てるデータの割合。部分分割またはタイムスタンプ分割を使用する場合は、この値を設定します。 |
timestamp_split_key |
文字列 | データ分割のタイムスタンプを含む列の名前。タイムスタンプ分割を使用している場合は、この値を設定します。 |
ウィンドウ パラメータ
Vertex AI は、ローリング ウィンドウ戦略を使用して入力データから予測ウィンドウを生成します。ウィンドウ パラメータを未設定のままにした場合、Vertex AI はカウント戦略を使用します。デフォルトの最大値は 100,000,000
です。トレーニング パイプラインには、次のローリング ウィンドウ戦略があります。
ローリング ウィンドウ戦略 | 説明 | パラメータ |
---|---|---|
カウント |
Vertex AI によって生成されるウィンドウの数は、ユーザーが指定した最大値を超えないようにしてください。入力データセットの行数がウィンドウの最大数より小さい場合、すべての行を使用してウィンドウが生成されます。それ以外の場合、Vertex AI は行を選択するためにランダム サンプリングを実行します。ウィンドウの最大数のデフォルト値は 100,000,000 です。ウィンドウの最大数は 100,000,000 以下にしてください。 |
window_max_count |
ストライド |
Vertex AI は、X 入力行ごとに 1 つを使用して、最大 100,000,000 個のウィンドウを生成します。このオプションは、季節的な予測や定期的な予測に役立ちます。たとえば、ストライドの長さの値を 7 に設定すると、予測を 1 つの曜日に制限できます。1 ~1000 の値を指定できます。 |
window_stride_length |
列 |
値が True または False の列を入力データに追加できます。Vertex AI は、列の値が True のすべての入力行に対してウィンドウを生成します。True と False の値は、True 行の合計数が 100,000,000 未満である限り、任意の順序で設定できます。ブール値が推奨されますが、文字列値も使用できます。文字列値の大文字と小文字は区別されません。 |
window_column |
get_prophet_train_pipeline_and_parameters
でウィンドウ パラメータを次のように定義します。
パラメータ名 | 型 | 定義 |
---|---|---|
window_column |
文字列 | True と False の値が含まれる列の名前。 |
window_stride_length |
整数 | ストライドの長さの値。 |
window_max_count |
整数 | ウィンドウの最大数。 |
Prophet を使用して予測を行う
Vertex AI の Prophet 用モデル トレーニング パイプラインは、データの時系列ごとに 1 つの Prophet モデルを作成します。予測パイプラインは入力データを時系列 ID で集計し、時系列ごとに個別に予測を計算します。パイプラインは、Vertex AI Forecasting の形式に一致するように予測結果を分解します。
次のサンプルコードは、Prophet 予測パイプラインを実行する方法を示しています。
job = aiplatform.PipelineJob(
...
template_path=prediction_job_spec_path,
parameter_values=prediction_parameter_values,
...
)
job.run(...)
パイプラインとパラメータ値は次の関数で定義されます。
(
prediction_job_spec_path,
prediction_parameter_values,
) = utils.get_prophet_prediction_pipeline_and_parameters(
...
)
get_prophet_prediction_pipeline_and_parameters
パラメータのサブセットは次のとおりです。
パラメータ名 | 型 | 定義 |
---|---|---|
project |
文字列 | 実際のプロジェクト ID |
location |
文字列 | 実際のリージョン |
model_name |
文字列 | モデルリソースの名前。文字列を projects/{project}/locations/{location}/models/{model} のようにフォーマットします。 |
time_column |
文字列 | 時間列。時間列を指定する必要があります。すべての行に値が入っている必要があります。時間列は、特定の観測が行われた時刻を示します。 |
time_series_identifier_column |
文字列 | 時系列識別子の列。時系列識別子列を指定する必要があります。すべての行に値が入っている必要があります。通常、予測のトレーニング データには複数の時系列が含まれます。この識別子は、トレーニング データの特定の観測値が属する時系列を Vertex AI に指示します。特定の時系列内のすべての行は、時系列識別子列の値が同じになります。一般的な時系列識別子としては、商品 ID、店舗 ID、地域などがあります。1 つの時系列で、時系列識別子列のすべての行に同一の値を使用して予測モデルをトレーニングすることもできます。ただし、Vertex AI は 2 つ以上の時系列を含むトレーニング データに適しています。最適な結果を得るには、モデルのトレーニングに使用する列ごとに少なくとも 10 個の時系列を使用します。 |
target_column |
文字列 | このモデルに予測させる列(値)。 |
data_source_csv_filenames |
文字列 | Cloud Storage に保存されている CSV の URI。 |
data_source_bigquery_table_path |
文字列 | BigQuery テーブルの URI。 |
bigquery_destination_uri |
文字列 | 目的の宛先データセットの URI。この値が設定されていない場合、プロジェクト内の新しいデータセットにリソースが作成されます。 |
machine_type |
文字列 | バッチ予測に使用するマシンタイプ。 |
max_num_workers |
整数 | バッチ予測に使用するワーカーの最大数。 |