使用 TRANSFORM 子句執行特徵工程

本教學課程說明如何使用 CREATE MODEL 陳述式的 TRANSFORM 子句,在建立及訓練模型的同時執行特徵工程。使用 TRANSFORM 子句,您可以指定一或多個預先處理函式,轉換用於訓練模型的輸入資料。使用 ML.EVALUATEML.PREDICT 函式時,系統會自動套用您對模型執行的前處理作業。

本教學課程使用公開的bigquery-public-data.ml_datasets.penguin資料集

建立資料集

建立 BigQuery 資料集來儲存機器學習模型。

控制台

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery 頁面

  2. 在「Explorer」窗格中,按一下專案名稱。

  3. 依序點按 「View actions」(查看動作) >「Create dataset」(建立資料集)

  4. 在「建立資料集」頁面中,執行下列操作:

    • 在「Dataset ID」(資料集 ID) 中輸入 bqml_tutorial

    • 針對「Location type」(位置類型) 選取「Multi-region」(多區域),然後選取「US (multiple regions in United States)」(us (多個美國區域))

    • 其餘設定請保留預設狀態,然後按一下「建立資料集」

bq

如要建立新的資料集,請使用 bq mk 指令搭配 --location 旗標。如需可能的完整參數清單,請參閱 bq mk --dataset 指令參考資料。

  1. 建立名為「bqml_tutorial」的資料集,並將資料位置設為「US」,說明則設為「BigQuery ML tutorial dataset」:

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    這個指令採用 -d 捷徑,而不是使用 --dataset 旗標。如果您省略 -d--dataset,該指令預設會建立資料集。

  2. 確認資料集已建立完成:

    bq ls

API

請呼叫 datasets.insert 方法,搭配已定義的資料集資源

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrames

在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程中的 BigQuery DataFrames 設定說明操作。 詳情請參閱 BigQuery DataFrames 參考說明文件

如要驗證 BigQuery,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

建立模型

建立線性迴歸模型來預測企鵝體重,並在 penguins 範例資料表上訓練模型。

OPTIONS(model_type='linear_reg', input_label_cols=['body_mass_g']) 子句代表您在建立線性迴歸模型。線性迴歸模型會從輸入特徵的線性組合產生連續值。body_mass_g 資料欄是輸入標籤欄。對線性迴歸模型而言,標籤欄必須為實際的值 (也就是資料欄值必須為實數)。

這個查詢的 TRANSFORM 子句會使用 SELECT 陳述式中的下列資料欄:

  • body_mass_g:用於訓練,不進行任何變更。
  • culmen_depth_mm:用於訓練,不進行任何變更。
  • flipper_length_mm:用於訓練,不進行任何變更。
  • bucketized_culmen_length:根據分位數,使用 ML.QUANTILE_BUCKETIZE() 分析函式將 culmen_length_mm 區化,藉此從 culmen_length_mm 產生。
  • culmen_length_mm:原始 culmen_length_mm 值,轉換為 STRING 值並用於訓練。
  • species_sex:使用 ML.FEATURE_CROSS 函式,從 speciessex 的交集產生。

您不必在 TRANSFORM 子句中使用訓練資料表中的所有資料欄。

WHERE 子句 - WHERE body_mass_g IS NOT NULL AND RAND() < 0.2 - 排除企鵝體重為 NULL 的資料列,並使用 RAND 函數來進行隨機資料抽樣。

請按照下列步驟建立模型:

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    CREATE OR REPLACE MODEL `bqml_tutorial.penguin_transform`
      TRANSFORM(
        body_mass_g,
        culmen_depth_mm,
        flipper_length_mm,
        ML.QUANTILE_BUCKETIZE(culmen_length_mm, 10) OVER () AS bucketized_culmen_length,
        CAST(culmen_length_mm AS string) AS culmen_length_mm,
        ML.FEATURE_CROSS(STRUCT(species, sex)) AS species_sex)
      OPTIONS (
        model_type = 'linear_reg',
        input_label_cols = ['body_mass_g'])
    AS
    SELECT
      *
    FROM
      `bigquery-public-data.ml_datasets.penguins`
    WHERE
      body_mass_g IS NOT NULL
      AND RAND() < 0.2;

    查詢作業約需 15 分鐘才能完成,完成後 penguin_transform 模型會顯示在「Explorer」窗格中。由於查詢是使用 CREATE MODEL 陳述式建立模型,因此您不會看到查詢結果。

評估模型

使用 ML.EVALUATE 函式評估模型效能。 ML.EVALUATE 函式會根據訓練資料中的實際企鵝體重,評估模型傳回的預測企鵝體重。

這個查詢的巢狀 SELECT 陳述式及 FROM 子句與 CREATE MODEL 查詢中的相同。由於您在建立模型時使用了 TRANSFORM 子句,因此不必在 ML.EVALUATE 函式中再次指定資料欄和轉換。函式會自動從模型中擷取這些值。

請按照下列步驟評估模型:

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    SELECT
      *
    FROM
      ML.EVALUATE(
        MODEL `bqml_tutorial.penguin_transform`,
        (
          SELECT
            *
          FROM
            `bigquery-public-data.ml_datasets.penguins`
          WHERE
            body_mass_g IS NOT NULL
        ));

    結果應如下所示:

    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    | mean_absolute_error | mean_squared_error | mean_squared_log_error | median_absolute_error |      r2_score      | explained_variance |
    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    |   64.21134350607677 | 13016.433317859564 |   7.140935762696211E-4 |     15.31788461553515 | 0.9813042531507734 | 0.9813186268757634 |
    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    

    評估結果中有個重要的指標,就是 R2 分數。R2 分數是種統計量具,用來確認線性迴歸的預測結果是否趨近於實際資料。0 值代表模型無法解釋平均值周圍之回應資料的變化。1 值代表模型能夠解釋所有平均值周圍之回應資料的所有變化。

    如要進一步瞭解 ML.EVALUATE 函式輸出內容,請參閱「輸出內容」。

    您也可以呼叫 ML.EVALUATE,而不提供輸入資料。並使用訓練期間計算的評估指標。

使用模型預測企鵝體重

使用 ML.PREDICT 函式搭配模型,預測雄性企鵝的體重。

ML.PREDICT 函式會在 predicted_label_column_name 資料欄中輸出預測值,在本例中為 predicted_body_mass_g

使用 ML.PREDICT 函式時,不必傳遞模型訓練中使用的所有資料欄。您只需要在 TRANSFORM 子句中使用過的資料欄。與 ML.EVALUATE 類似,ML.PREDICT 函式會自動從模型擷取 TRANSFORM 欄和轉換。

請按照下列步驟,從模型取得預測結果:

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中貼上以下查詢,然後點選「執行」

    SELECT
      predicted_body_mass_g
    FROM
      ML.PREDICT(
        MODEL `bqml_tutorial.penguin_transform`,
        (
          SELECT
            *
          FROM
            `bigquery-public-data.ml_datasets.penguins`
          WHERE
            sex = 'MALE'
        ));

    結果應如下所示:

    +-----------------------+
    | predicted_body_mass_g |
    +-----------------------+
    |    2810.2868541725757 |
    +-----------------------+
    |    3813.6574220842676 |
    +-----------------------+
    |     4098.844698262214 |
    +-----------------------+
    |     4256.587135004173 |
    +-----------------------+
    |     3008.393497302691 |
    +-----------------------+
    |     ...               |
    +-----------------------+