使用 TRANSFORM 子句執行特徵工程


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

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

目標

本教學課程會逐步引導您完成下列工作:

費用

本教學課程使用 Google Cloud的計費元件,包括:

  • BigQuery
  • BigQuery ML

如要進一步瞭解 BigQuery 費用,請參閱 BigQuery 定價頁面。

事前準備

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. 新專案會自動啟用 BigQuery。如要在現有專案中啟用 BigQuery,請前往

    Enable the BigQuery API.

    Enable the API

建立資料集

建立 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 (多個美國區域))

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

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 |
    +-----------------------+
    |     ...               |
    +-----------------------+
    

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。

  • 您可以刪除建立的專案。
  • 或者您可以保留專案並刪除資料集。

刪除資料集

刪除專案將移除專案中所有的資料集與資料表。若您希望重新使用專案,您可以刪除本教學課程中所建立的資料集。

  1. 如有必要,請在Google Cloud 控制台中開啟 BigQuery 頁面。

    前往 BigQuery 頁面

  2. 在導覽面板中,按一下您建立的 bqml_tutorial 資料集。

  3. 在視窗右側,按一下「刪除資料集」。這項操作會刪除資料集、資料表和所有資料。

  4. 在「Delete dataset」(刪除資料集) 對話方塊中,輸入資料集的名稱 (bqml_tutorial),然後按一下 [Delete] (刪除) 來確認刪除指令。

刪除專案

如要刪除專案,請進行以下操作:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

後續步驟