訓練預測模型

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

事前準備

訓練預測模型前,請先完成下列步驟:

訓練模型

Google Cloud 控制台

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

    前往「資料集」頁面

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

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

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

  5. 選取「其他」

  6. 在「訓練方法」頁面中,完成以下設定:

    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」

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

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

    11. 按一下「繼續」

  8. 在「訓練選項」頁面中,按照下列方式設定:

    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 萬 10 6 3 到 6 小時
      2,000 萬 50 13 6 到 12 小時
      1,600 萬 30 365 24-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

如要瞭解如何安裝或更新 Python 適用的 Vertex AI SDK,請參閱「安裝 Python 適用的 Vertex AI SDK」。 詳情請參閱 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 要求的 trainingTaskInputs 中新增下列內容。MAX_COUNT_VALUE 是指視窗數量上限。

      "windowConfig": {
        "maxCount": MAX_COUNT_VALUE
      },
      ```
    
  • 如要使用 strideLength 選項,請在 JSON 要求的 trainingTaskInputs 中新增下列內容。STRIDE_LENGTH_VALUE 是指步長的長度值。

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

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

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

後續步驟