使用 Prophet 進行預測

Prophet 是 Meta 維護的預測模型。如要瞭解演算法詳情,請參閱 Prophet 論文,如要進一步瞭解程式庫,請參閱說明文件

BigQuery ML ARIMA_PLUS 類似,Prophet 會嘗試將每個時間序列分解為趨勢、季節和節慶,並使用這些模型推論的匯總結果產生預測。不過,BQML ARIMA+ 是使用 ARIMA 建立趨勢元件模型,而 Prophet 則嘗試使用分段式羅吉斯迴歸或線性模型來擬合曲線,這是兩者之間的重要差異。

Google Cloud 提供訓練 Prophet 模型的管道,以及從 Prophet 模型取得批次推論結果的管道。這兩個管道都是 Google Cloud Pipeline Components (GCPC) 的 Vertex AI Pipelines 執行個體。

將 Prophet 與 Vertex AI 整合後,您就能執行下列操作:

雖然 Prophet 是多元模型,但 Vertex AI 僅支援單元版本。

如要瞭解這個工作流程使用的服務帳戶,請參閱表格工作流程的服務帳戶

Workflow 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 字串 時間序列 ID 欄。您必須指定時間序列 ID 欄,且每個資料列都必須有值。預測訓練資料通常包含多個時間序列,而 ID 會告知 Vertex AI 訓練資料中特定觀察結果所屬的時間序列。特定時間序列中的所有資料列,在時間序列 ID 欄中都有相同的值。常見的時間序列 ID 可能包括產品 ID、商店 ID 或區域。您可以針對單一時間序列訓練預測模型,時間序列 ID 欄中所有資料列的值都相同。不過,如果訓練資料包含兩個以上的時間序列,則更適合使用 Vertex AI。為獲得最佳結果,請為用於訓練模型的每個資料欄至少提供 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 工作的自訂服務帳戶。您可以將 Dataflow 工作設為使用私有 IP 位址和特定虛擬私有雲子網路。這個參數會覆寫預設的 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 個輸入資料列中的一個來生成視窗,最多可生成 100,000,000 個視窗。這個選項適用於季節性或定期的預測。舉例來說,您可以將步幅長度值設為 7,將預測限制為每週的單一日期。這個值可介於 11000 之間。 window_stride_length
您可以在輸入資料中新增資料欄,其中的值為 TrueFalse。Vertex AI 會為每個輸入資料列產生視窗,其中資料欄的值為 TrueTrueFalse 值可以依任意順序設定,只要 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 模型訓練管道會為資料中的每個時間序列建立一個 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 字串 時間序列 ID 欄。您必須指定時間序列 ID 欄,且每個資料列都必須有值。預測訓練資料通常包含多個時間序列,而 ID 會告知 Vertex AI 訓練資料中特定觀察結果所屬的時間序列。特定時間序列中的所有資料列,在時間序列 ID 欄中都有相同的值。常見的時間序列 ID 可能包括產品 ID、商店 ID 或區域。您可以針對單一時間序列訓練預測模型,時間序列 ID 欄中所有資料列的值都相同。不過,如果訓練資料包含兩個以上的時間序列,則更適合使用 Vertex AI。為獲得最佳結果,請為用於訓練模型的每個資料欄至少提供 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 整數 用於批次推論的工作站數量上限。