使用 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. 在「Create dataset」頁面上執行下列操作:

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

    • 在「位置類型」中選取「多區域」,然後選取「美國 (多個美國區域)」

    • 保留其餘預設設定,然後點選「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 快速入門:使用 BigQuery DataFrames,按照 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 模型。由於查詢是使用 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. 按一下視窗右側的「Delete dataset」。這項操作會刪除資料集、資料表和所有資料。

  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.

後續步驟