Prophet による予測

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 の統合により、次のことが可能になります。

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 文字列 トレーニング データの粒度、予測ホライズン、コンテキスト ウィンドウに使用する単位。minutehourdayweekmonthyear のいずれかです。詳しくは、データの粒度を選択する方法をご覧ください。
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 は、時間列を使用してデータ行の時系列を判断します。
  • training_fraction
  • validation_fraction
  • test_fraction
タイムスタンプ分割 Vertex AI は、training_fractionvalidation_fractiontest_fraction の値を使用して、トレーニング セット、検証セット、テストセットにデータを分割します。Vertex AI は、timestamp_split_key 列を使用してデータ行の時系列を判断します。
  • training_fraction
  • validation_fraction
  • test_fraction
  • timestamp_split_key
手動(事前定義)分割 Vertex AI は、predefined_split_key 列の TRAIN、VALIDATE、または TEST の値を使用してデータを分割します。
  • predefined_split_key

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 つの曜日に制限できます。11000 の値を指定できます。 window_stride_length
値が True または False の列を入力データに追加できます。Vertex AI は、列の値が True のすべての入力行に対してウィンドウを生成します。TrueFalse の値は、True 行の合計数が 100,000,000 未満である限り、任意の順序で設定できます。ブール値が推奨されますが、文字列値も使用できます。文字列値の大文字と小文字は区別されません。 window_column

get_prophet_train_pipeline_and_parameters でウィンドウ パラメータを次のように定義します。

パラメータ名 定義
window_column 文字列 TrueFalse の値が含まれる列の名前。
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 整数 バッチ予測に使用するワーカーの最大数。