訓練預測模型

本頁說明如何使用 Google Cloud 控制台或 Vertex AI API,從資料表資料集訓練預測模型。

事前準備

您必須先完成下列步驟,才能訓練預測模型:

訓練模型

Google Cloud 控制台

  1. 在 Google Cloud 控制台的 Vertex AI 專區中,前往「Datasets」頁面。

    前往「資料集」頁面

  2. 按一下要用來訓練模型的資料集名稱,開啟資料集詳細資料頁面。

  3. 如果資料類型使用註解集,請選取要為此模型使用的註解集。

  4. 按一下「訓練新模型」

  5. 選取「其他」

  6. 在「Training method」頁面中,完成以下設定:

    1. 選取模型訓練方法。詳情請參閱「模型訓練方法」。

    2. 按一下「繼續」

  7. 在「Model details」頁面中,按照下列方式進行設定:

    1. 輸入新模式的顯示名稱。

    2. 選取目標欄。

      目標欄是模型要預測的值。進一步瞭解指定欄位規定

    3. 如果您尚未在資料集中設定系列 ID時間戳記,請立即選取這些欄。

    4. 選取資料精細程度。如果您想使用節慶活動效果模擬功能,請選取 Daily瞭解如何選擇資料精細程度

    5. 選用:在「假日地區」下拉式選單中,選擇一或多個地理區域,啟用假日效果模擬功能。在訓練期間,Vertex AI 會根據 時間戳記欄的日期和指定地理區域,在模型中建立節日分類特徵。只有在「資料細緻度」設為 Daily 時,才能選取這個選項。根據預設,系統會停用節慶效應模擬功能。如要瞭解用於假日效應模擬的區域,請參閱「節慶區域」。

    6. 輸入背景資訊視窗預測時間範圍

      預測期間會決定模型預測每列預測資料的目標值時,會預測多久的未來。預測期間是以資料精細程度為單位指定。

      背景期間會設定模型在訓練期間 (以及預測時) 回溯的時間長度。換句話說,每個訓練資料點的背景區間會決定模型要回溯多久的時間來尋找預測模式。背景時間區間是以資料精細程度的單位指定。

      瞭解詳情

    7. 如果您想將測試資料集匯出至 BigQuery,請勾選「將測試資料集匯出至 BigQuery」,並提供資料表名稱。

    8. 如要手動控制資料分割或設定預測時間窗格,請開啟「進階選項」

    9. 預設資料分割方式是依時間排序,並採用標準的 80/10/10 百分比。如果您想手動指定要將哪些資料列指派給哪個分割區,請選取「手動」,然後指定資料分割欄。

      進一步瞭解資料分割

    10. 選取用於產生預測區間的滑動區間策略。預設策略為「計數」

      • Count:在提供的文字方塊中設定視窗數量上限。
      • Stride:在提供的文字方塊中設定步幅長度值。
      • 資料欄:從下拉式選單中選取適當的資料欄名稱。

      詳情請參閱「滾動週期策略」。

    11. 按一下「繼續」

  8. 在「Training options」頁面中,按照下列方式進行設定:

    1. 如果您尚未產生統計資料,請按一下「產生統計資料」

      產生統計資料後,系統會在「轉換」下拉式選單中填入資料。

    2. 查看資料欄清單,並從訓練中排除任何不應用於訓練模型的資料欄。

      如果您使用資料分割欄,請一併納入。

    3. 查看為所納入功能選取的轉換作業,並視需要進行更新。

      資料列若包含所選轉換作業無效的資料,就會從訓練中排除。進一步瞭解轉換

    4. 針對用於訓練的每個資料欄,請指定特徵類型,說明該特徵與其時間序列的關聯方式,以及在預測時間是否可用。進一步瞭解特徵類型和供應情形

    5. 如要指定權重欄、變更預設最佳化目標,或啟用階層式預測功能,請開啟「進階選項」

    6. (選用) 如要指定權重資料欄,請從下拉式清單中選取該欄。進一步瞭解權重欄

    7. (選用) 如要選取最佳化目標,請從清單中選取。進一步瞭解最佳化目標

    8. (選用) 如果您想使用階層式預測,請選取「啟用階層式預測」。您可以選擇下列三種分組選項:

      • No grouping
      • Group by columns
      • Group all

      您也可以選擇設定下列總和損失權重:

      • Group total weight:只有在您選取 Group by columnsGroup all 選項時,才能設定這個欄位。
      • Temporal total weight
      • Group temporal total weight:只有在您選取 Group by columnsGroup all 選項時,才能設定這個欄位。

      進一步瞭解階層式預測

    9. 按一下「繼續」

  9. 在「Compute and pricing」頁面中,完成以下設定:

    1. 輸入模型訓練時數上限。這項設定可協助您設定訓練費用上限。實際經過的時間可能會比這個值長,因為建立新模型時會涉及其他作業。

      建議的訓練時間與預測時間範圍和訓練資料的大小有關。下表列出一些預測訓練執行作業的範例,以及訓練高品質模型所需的訓練時間範圍。

      資料列功能預測期間訓練時間
      1,200 萬1063 到 6 小時
      2,000 萬50136 到 12 小時
      1,600 萬3036524-48 小時

      如要瞭解訓練定價資訊,請參閱定價頁面

    2. 按一下「開始訓練」

      模型訓練作業可能需要花費數小時,視資料的大小和複雜度以及您指定的訓練預算而定。您可以關閉這個分頁,稍後再返回查看。模型訓練完成後,您會收到電子郵件通知。

API

選取所需語言或環境的分頁:

REST

您可以使用 trainingPipelines.create 指令訓練模型。

使用任何要求資料之前,請先替換以下項目:

  • LOCATION:您的區域。
  • PROJECT:您的專案 ID
  • TRAINING_PIPELINE_DISPLAY_NAME:為此作業建立的訓練管道顯示名稱。
  • TRAINING_TASK_DEFINITION:模型訓練方法。
    • 時間序列稠密型編碼器 (TiDE)
      gs://google-cloud-aiplatform/schema/trainingjob/definition/time_series_dense_encoder_forecasting_1.0.0.yaml
    • 時間融合轉換器 (TFT)
      gs://google-cloud-aiplatform/schema/trainingjob/definition/temporal_fusion_transformer_time_series_forecasting_1.0.0.yaml
    • AutoML (L2L)
      gs://google-cloud-aiplatform/schema/trainingjob/definition/automl_forecasting_1.0.0.yaml
    • Seq2Seq+
      gs://google-cloud-aiplatform/schema/trainingjob/definition/seq2seq_plus_time_series_forecasting_1.0.0.yaml
    詳情請參閱「模型訓練方法」。
  • TARGET_COLUMN:您要讓模型預測的資料欄 (值)。
  • TIME_COLUMN:時間欄。瞭解詳情
  • TIME_SERIES_IDENTIFIER_COLUMN:時間序列 ID 欄。瞭解詳情
  • WEIGHT_COLUMN:(選用) 權重欄。瞭解詳情
  • TRAINING_BUDGET:模型訓練的最大時間長度,以毫節點時數為單位 (1,000 毫節點時數等於 1 節點時數)。
  • GRANULARITY_UNIT:用於訓練資料、預測期間和背景期間精細程度的單位。可以是 minutehourdayweekmonthyear。如要使用節慶假日效果模擬功能,請選取 day瞭解如何選擇資料精細程度
  • GRANULARITY_QUANTITY:訓練資料中觀察值間隔的細緻度單位數量。除了分鐘以外,所有單位都必須為 1,分鐘可以是 1、5、10、15 或 30。瞭解如何選擇資料精細程度
  • GROUP_COLUMNS:訓練輸入表中的資料欄名稱,用於識別階層層級的分組。欄必須是 `time_series_attribute_columns`。瞭解詳情
  • GROUP_TOTAL_WEIGHT:相對於個別損失,群組匯總損失的權重。如果設為 `0.0` 或未設定,則會停用。如果未設定群組資料欄,系統會將所有時間序列視為同一群組的一部分,並對所有時間序列進行匯總。瞭解詳情
  • TEMPORAL_TOTAL_WEIGHT:匯總損失相對於個別損失的權重。如果設為 `0.0` 或未設定,則會停用。瞭解詳情
  • GROUP_TEMPORAL_TOTAL_WEIGHT:相對於個別損失,匯總損失 (群組 x 時間) 的權重。如果設為 `0.0` 或未設定,則會停用。如果未設定群組資料欄,系統會將所有時間序列視為同一群組的一部分,並匯總所有時間序列。瞭解詳情
  • HOLIDAY_REGIONS:(選用) 您可以選取一或多個地理區域,啟用節日效應模擬功能。在訓練期間,Vertex AI 會根據 TIME_COLUMN 的日期和指定地理區域,在模型中建立節日分類特徵。如要啟用此功能,請將 GRANULARITY_UNIT 設為 day,並在 HOLIDAY_REGIONS 欄位中指定一或多個區域。根據預設,系統會停用節慶效應模擬功能。詳情請參閱「節慶區域」一文。
  • FORECAST_HORIZON:預測期間決定模型預測每列預測資料的目標值時,會預測多久的未來。預測期間會以資料精細度單位 (GRANULARITY_UNIT) 指定。瞭解詳情
  • CONTEXT_WINDOW:脈絡視窗會設定模型在訓練期間 (以及預測時) 查詢的回溯時間長度。換句話說,每個訓練資料點的背景區間會決定模型要回溯多久的時間來尋找預測模式。背景資訊視窗會以資料精細度單位 (GRANULARITY_UNIT) 指定。瞭解詳情
  • OPTIMIZATION_OBJECTIVE:根據預設,Vertex AI 會盡量減少均方根誤差 (RMSE)。如果您想為預測模型設定其他最佳化目標,請在「預測模型的最佳化目標」中選擇其中一個選項。如果您選擇盡量減少分位數損失,則必須一併指定 QUANTILES 的值。
  • PROBABILISTIC_INFERENCE:(選用) 如果設為 true,Vertex AI 會模擬預測的機率分布。機率推論可處理雜訊資料並量化不確定性,進而提升模型品質。如果指定 QUANTILES,Vertex AI 也會傳回機率分佈的百分位數。機率推論僅與 Time series Dense Encoder (TiDE)AutoML (L2L) 訓練方法相容。與階層式預測和 minimize-quantile-loss 最佳化目標不相容。
  • QUANTILES:用於 minimize-quantile-loss 最佳化目標和機率推論的百分位數。請提供一覽表,列出介於 01 之間 (不含 01) 的最多五個不重複數字。
  • TIME_SERIES_ATTRIBUTE_COL:時間序列屬性的欄名稱。瞭解詳情
  • AVAILABLE_AT_FORECAST_COL:在預測期間已知值的協變數欄名稱。瞭解詳情
  • UNAVAILABLE_AT_FORECAST_COL:在預測期間未知值的共變量欄名稱。瞭解詳情
  • TRANSFORMATION_TYPE:系統會為用於訓練模型的每個資料欄提供轉換類型。瞭解詳情
  • COLUMN_NAME:含有指定轉換類型的資料欄名稱。必須指定用於訓練模型的每個資料欄。
  • MODEL_DISPLAY_NAME:新訓練模型的顯示名稱。
  • DATASET_ID:訓練資料集 ID。
  • 您可以提供 Split 物件來控制資料分割作業。如要瞭解如何控制資料分割,請參閱「使用 REST 控制資料分割」。
  • 您可以提供 windowConfig 物件,為預測時間窗口產生滾動式時間窗口策略。詳情請參閱「使用 REST 設定滾動式時間窗口策略」。
  • PROJECT_NUMBER:系統自動產生的專案編號

HTTP 方法和網址:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/trainingPipelines

JSON 要求主體:

{
    "displayName": "TRAINING_PIPELINE_DISPLAY_NAME",
    "trainingTaskDefinition": "TRAINING_TASK_DEFINITION",
    "trainingTaskInputs": {
        "targetColumn": "TARGET_COLUMN",
        "timeColumn": "TIME_COLUMN",
        "timeSeriesIdentifierColumn": "TIME_SERIES_IDENTIFIER_COLUMN",
        "weightColumn": "WEIGHT_COLUMN",
        "trainBudgetMilliNodeHours": TRAINING_BUDGET,
        "dataGranularity": {"unit": "GRANULARITY_UNIT", "quantity": GRANULARITY_QUANTITY},
        "hierarchyConfig": {"groupColumns": GROUP_COLUMNS, "groupTotalWeight": GROUP_TOTAL_WEIGHT, "temporalTotalWeight": TEMPORAL_TOTAL_WEIGHT, "groupTemporalTotalWeight": GROUP_TEMPORAL_TOTAL_WEIGHT}
        "holidayRegions" : ["HOLIDAY_REGIONS_1", "HOLIDAY_REGIONS_2", ...]
        "forecast_horizon": FORECAST_HORIZON,
        "context_window": CONTEXT_WINDOW,
        "optimizationObjective": "OPTIMIZATION_OBJECTIVE",
        "quantiles": "QUANTILES",
        "enableProbabilisticInference": "PROBABILISTIC_INFERENCE",
        "time_series_attribute_columns": ["TIME_SERIES_ATTRIBUTE_COL_1", "TIME_SERIES_ATTRIBUTE_COL_2", ...]
        "available_at_forecast_columns": ["AVAILABLE_AT_FORECAST_COL_1", "AVAILABLE_AT_FORECAST_COL_2", ...]
        "unavailable_at_forecast_columns": ["UNAVAILABLE_AT_FORECAST_COL_1", "UNAVAILABLE_AT_FORECAST_COL_2", ...]
        "transformations": [
            {"TRANSFORMATION_TYPE_1":  {"column_name" : "COLUMN_NAME_1"} },
            {"TRANSFORMATION_TYPE_2":  {"column_name" : "COLUMN_NAME_2"} },
            ...
    },
    "modelToUpload": {"displayName": "MODEL_DISPLAY_NAME"},
    "inputDataConfig": {
      "datasetId": "DATASET_ID",
    }
}

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/trainingPipelines/TRAINING_PIPELINE_ID",
  "displayName": "myModelName",
  "trainingTaskDefinition": "gs://google-cloud-aiplatform/schema/trainingjob/definition/automl_tabular_1.0.0.yaml",
  "modelToUpload": {
    "displayName": "myModelName"
  },
  "state": "PIPELINE_STATE_PENDING",
  "createTime": "2020-08-18T01:22:57.479336Z",
  "updateTime": "2020-08-18T01:22:57.479336Z"
}

Python 適用的 Vertex AI SDK

如要瞭解如何安裝或更新 Python 適用的 Vertex AI SDK,請參閱「安裝 Python 適用的 Vertex AI SDK」。 詳情請參閱 Vertex AI SDK for Python API 參考說明文件

def create_training_pipeline_forecasting_time_series_dense_encoder_sample(
    project: str,
    display_name: str,
    dataset_id: str,
    location: str = "us-central1",
    model_display_name: str = "my_model",
    target_column: str = "target_column",
    time_column: str = "date",
    time_series_identifier_column: str = "time_series_id",
    unavailable_at_forecast_columns: List[str] = [],
    available_at_forecast_columns: List[str] = [],
    forecast_horizon: int = 1,
    data_granularity_unit: str = "week",
    data_granularity_count: int = 1,
    training_fraction_split: float = 0.8,
    validation_fraction_split: float = 0.1,
    test_fraction_split: float = 0.1,
    budget_milli_node_hours: int = 8000,
    timestamp_split_column_name: str = "timestamp_split",
    weight_column: str = "weight",
    time_series_attribute_columns: List[str] = [],
    context_window: int = 0,
    export_evaluated_data_items: bool = False,
    export_evaluated_data_items_bigquery_destination_uri: Optional[str] = None,
    export_evaluated_data_items_override_destination: bool = False,
    quantiles: Optional[List[float]] = None,
    enable_probabilistic_inference: bool = False,
    validation_options: Optional[str] = None,
    predefined_split_column_name: Optional[str] = None,
    sync: bool = True,
):
    aiplatform.init(project=project, location=location)

    # Create training job
    forecasting_tide_job = aiplatform.TimeSeriesDenseEncoderForecastingTrainingJob(
        display_name=display_name,
        optimization_objective="minimize-rmse",
    )

    # Retrieve existing dataset
    dataset = aiplatform.TimeSeriesDataset(dataset_id)

    # Run training job
    model = forecasting_tide_job.run(
        dataset=dataset,
        target_column=target_column,
        time_column=time_column,
        time_series_identifier_column=time_series_identifier_column,
        unavailable_at_forecast_columns=unavailable_at_forecast_columns,
        available_at_forecast_columns=available_at_forecast_columns,
        forecast_horizon=forecast_horizon,
        data_granularity_unit=data_granularity_unit,
        data_granularity_count=data_granularity_count,
        training_fraction_split=training_fraction_split,
        validation_fraction_split=validation_fraction_split,
        test_fraction_split=test_fraction_split,
        predefined_split_column_name=predefined_split_column_name,
        timestamp_split_column_name=timestamp_split_column_name,
        weight_column=weight_column,
        time_series_attribute_columns=time_series_attribute_columns,
        context_window=context_window,
        export_evaluated_data_items=export_evaluated_data_items,
        export_evaluated_data_items_bigquery_destination_uri=export_evaluated_data_items_bigquery_destination_uri,
        export_evaluated_data_items_override_destination=export_evaluated_data_items_override_destination,
        quantiles=quantiles,
        enable_probabilistic_inference=enable_probabilistic_inference,
        validation_options=validation_options,
        budget_milli_node_hours=budget_milli_node_hours,
        model_display_name=model_display_name,
        sync=sync,
    )

    model.wait()

    print(model.display_name)
    print(model.resource_name)
    print(model.uri)
    return model

使用 REST 控管資料分割

您可以控制訓練資料如何在訓練集、驗證集和測試集之間分割。使用分割欄手動指定每個資料列的分割資料,並在 JSON 要求的 inputDataConfig 中,將分割資料提供為 PredefinedSplit Split 物件的一部分。

DATA_SPLIT_COLUMN 是包含資料分割值 (TRAINVALIDATIONTEST) 的資料欄。

"predefinedSplit": {
  "key": DATA_SPLIT_COLUMN
},

進一步瞭解資料分割。

使用 REST 設定回溯期策略

您可以提供 windowConfig 物件,為預測時間窗口產生滾動式時間窗口策略。預設策略為 maxCount

  • 如要使用 maxCount 選項,請將下列內容新增至 JSON 要求的 trainingTaskInputsMAX_COUNT_VALUE 是指視窗數量上限。

      "windowConfig": {
        "maxCount": MAX_COUNT_VALUE
      },
      ```
    
  • 如要使用 strideLength 選項,請將下列內容新增至 JSON 要求的 trainingTaskInputsSTRIDE_LENGTH_VALUE 是步長的值。

      "windowConfig": {
        "strideLength": STRIDE_LENGTH_VALUE
      },
      ```
    
  • 如要使用 column 選項,請將下列內容新增至 JSON 要求的 trainingTaskInputsCOLUMN_NAME 是指含有 TrueFalse 值的資料欄名稱。

      "windowConfig": {
        "column": "COLUMN_NAME"
      },
      ```
    

詳情請參閱「滾動週期策略」。

後續步驟