使用 BigQuery ML 預測企鵝重量

在本教學課程中,您將使用 BigQuery ML 中的線性迴歸模型,根據企鵝的人口統計資訊預測企鵝的體重。線性迴歸是一種迴歸模型,可從輸入特徵的線性組合產生連續值。

本教學課程使用 bigquery-public-data.ml_datasets.penguins 資料集。

目標

在本教學課程中,您會執行下列工作:

  • 建立線性迴歸模型。
  • 評估模型。
  • 使用模型進行預測。

費用

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

  • BigQuery
  • BigQuery ML

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

如要進一步瞭解 BigQuery ML 費用,請參閱「BigQuery ML 定價」。

事前準備

  1. 在 Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需具備特定 IAM 角色,只要您已獲派某個專案的角色,即可選取該專案。
    • 建立專案:如要建立專案,您必須具備專案建立者角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色。

    前往專案選取器

  2. 確認 Google Cloud 專案已啟用計費功能。

  3. 啟用 BigQuery API (如果尚未啟用)。

    啟用 API 所需的角色

    您必須具備 serviceusage.services.enable 權限,才能啟用 API。如果您建立了專案,可能已透過擁有者角色 (roles/owner) 取得這項權限。否則,您可以透過 Service Usage 管理員角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    啟用 API

所需權限

如要使用 BigQuery ML 建立模型,您需要下列 IAM 權限:

  • bigquery.jobs.create
  • bigquery.models.create
  • bigquery.models.getData
  • bigquery.models.updateData
  • bigquery.models.updateMetadata

如要執行推論,您必須具備下列權限:

  • 模型上的bigquery.models.getData
  • bigquery.jobs.create

建立資料集

如要建立 BigQuery 資料集,請選取下列其中一個選項:

控制台

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

    前往「BigQuery」

  2. 點選左側窗格中的 「Explorer」。

    醒目顯示的「Explorer」窗格按鈕。

    如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。

  3. 在「Explorer」中展開專案,然後按一下「資料集」。

  4. 在「Datasets」(資料集) 頁面,按一下「Create dataset」(建立資料集)。

  5. 在「建立資料集」窗格中,執行下列操作:

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

    • 在「資料位置」部分,選取「US」。

    其餘預設設定則保持不變。

  6. 點選「建立資料集」。

bq

如要建立新的資料集,請使用 bq mk --dataset 指令。

  1. 建立名為 bqml_tutorial 的資料集,並將資料位置設為 US:

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  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)

建立模型

使用 BigQuery 的 Analytics 範例資料集,建立線性迴歸模型。

SQL

您可以使用 CREATE MODEL 陳述式建立線性迴歸模型,並將模型類型指定為 LINEAR_REG。建立模型時,也需要訓練模型。

以下是 CREATE MODEL 陳述式的實用資訊:

  • input_label_cols 選項會指定 SELECT 陳述式中的哪個資料欄要做為標籤欄。這裡的標籤欄是 body_mass_g。如果是線性迴歸模型,標籤欄必須是實數值,也就是說,資料欄值必須是實數。
  • 這項查詢的 SELECT 陳述式會使用 bigquery-public-data.ml_datasets.penguins 資料表中的下列資料欄,預測企鵝的體重:

    • species:企鵝的物種。
    • island::企鵝居住的島嶼。
    • culmen_length_mm:企鵝嘴峰長度,以公釐為單位。
    • culmen_depth_mm:企鵝嘴峰深度,以公釐為單位。
    • flipper_length_mm:企鵝腳蹼長度,以公釐為單位。
    • sex:企鵝的性別。
  • 這項查詢的 SELECT 陳述式中,WHERE body_mass_g IS NOT NULL 的 WHERE 子句會排除 body_mass_g 欄為 NULL 的資料列。

執行查詢,建立線性迴歸模型:

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

    前往「BigQuery」

  2. 在查詢編輯器中執行下列查詢:

    CREATE OR REPLACE MODEL `bqml_tutorial.penguins_model`
    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;
  3. 建立 penguins_model 模型約需 30 秒。

    如要查看模型,請按照下列步驟操作:

    1. 點選左側窗格中的 「Explorer」。

      醒目顯示的「Explorer」窗格按鈕。

      如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。

    2. 在「Explorer」窗格中展開專案,然後點選「資料集」。

    3. 按一下「bqml_tutorial」資料集。

    4. 點按「模型」分頁標籤。

BigQuery DataFrames

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

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

import bigframes.pandas as bpd
from bigframes.bigquery import ml

# Set partial ordering mode for BigQuery DataFrames.
# For more information, see the BigQuery DataFrames performance documentation:
# https://cloud.google.com/bigquery/docs/dataframes-performance#partial-ordering-mode
bpd.options.bigquery.ordering_mode = "partial"

# Load data from BigQuery
bq_df = bpd.read_gbq("bigquery-public-data.ml_datasets.penguins")

# Drop rows with nulls to get training data
training_data = bq_df.dropna(subset=["body_mass_g"])

# A Linear Regression model predicts a continuous numerical value.
#
# Use ml.create_model to create and train the model in BigQuery.
# The options parameter specifies the model type and the label column.
# For more information, see the BigQuery DataFrames API reference documentation:
# https://dataframes.bigquery.dev/reference/api/bigframes.bigquery.ml.create_model.html#bigframes.bigquery.ml.create_model
ml.create_model(
    your_model_id,  # For example: "bqml_tutorial.penguins_model",
    options={
        "model_type": "LINEAR_REG",
        "input_label_cols": ["body_mass_g"],
    },
    training_data=training_data,
    replace=True,
)

建立模型約需 30 秒。如要查看模型,請按照下列步驟操作:

  1. 點選左側窗格中的 「Explorer」。

    醒目顯示的「Explorer」窗格按鈕。

  2. 在「Explorer」窗格中展開專案,然後點選「資料集」。

  3. 按一下「bqml_tutorial」資料集。

  4. 點按「模型」分頁標籤。

取得訓練統計資料

如要查看模型訓練結果,可以使用 ML.TRAINING_INFO 函式,或在 Google Cloud 控制台查看統計資料。在本教學課程中,您將使用 Google Cloud 控制台。

機器學習演算法建構模型時,會檢視大量的例子,藉此找出能將損失降到最低的模型。這個過程稱為經驗風險最小化。

損失是指對不良預測的懲罰。這個數字代表模型對單一樣本的預測結果有多不準確。如果這個模型的預測是完美的,則損失為 0,否則損失會大於 0。訓練模型的目的是從所有例子中找到平均損失分數低的一組權重和偏誤。

查看執行 CREATE MODEL 查詢時產生的模型訓練統計資料:

  1. 點選左側窗格中的 「Explorer」。

    醒目顯示的「Explorer」窗格按鈕。

  2. 在「Explorer」窗格中展開專案,然後點選「資料集」。

  3. 按一下「bqml_tutorial」資料集。

  4. 點按「模型」分頁標籤。

  5. 如要開啟模型資訊窗格,請按一下「penguins_model」penguins_model。

  6. 依序點選「Training」(訓練) 分頁標籤和「Table」(資料表)。結果應大致如下:

    ML.TRAINING_INFO 輸出

    「Training Data Loss」資料欄代表在訓練資料集上訓練模型後計算出來的損失指標。由於您執行的是線性迴歸,因此這個資料欄會顯示均方誤差值。這項訓練會自動使用 normal_equation 最佳化策略,因此只需要一次疊代,就能收斂至最終模型。如要進一步瞭解如何設定模型最佳化策略,請參閱 optimize_strategy。

評估模型

建立模型後,請使用 ML.EVALUATE 函式或 bigframes.bigquery.ml.evaluate BigQuery DataFrames 函式評估模型效能,根據實際資料評估模型產生的預測值。

SQL

ML.EVALUATE 函式會採用訓練好的模型和資料集做為輸入內容,該資料集的結構定義必須與您用來訓練模型的資料相同。在正式環境中,您應使用與訓練模型不同的資料來評估模型。如果您執行 ML.EVALUATE 時未提供輸入資料,函式會擷取訓練期間計算的評估指標。這些指標是使用自動保留的評估資料集計算得出:

    SELECT
      *
    FROM
      ML.EVALUATE(MODEL bqml_tutorial.penguins_model);
    

執行 ML.EVALUATE 查詢:

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

    前往「BigQuery」

  2. 在查詢編輯器中執行下列查詢:

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

BigQuery DataFrames

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

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

# Use the ml.evaluate method to evaluate the model with test data.
# For more information, see the BigQuery DataFrames API reference documentation:
# https://dataframes.bigquery.dev/reference/api/bigframes.bigquery.ml.evaluate.html#bigframes.bigquery.ml.evaluate
ml.evaluate(
    your_model_id,  # For example: "bqml_tutorial.penguins_model",
    input_=training_data,
)
# Expected output results:
# index  mean_absolute_error  mean_squared_error  mean_squared_log_error  median_absolute_error  r2_score  explained_variance
#   0        227.012237         81838.159892            0.00507                173.080816        0.872377    0.872377
#   1 rows x 6 columns

結果應大致如下:

ML.EVALUATE 輸出

由於您執行了線性迴歸,因此結果包含以下資料欄:

  • mean_absolute_error
  • mean_squared_error
  • mean_squared_log_error
  • median_absolute_error
  • r2_score
  • explained_variance

評估結果中的重要指標是 R2 分數。R2 分數是統計測量數,可判斷線性迴歸預測是否接近實際資料。如果值為 0,表示模型無法解釋回應資料在平均值附近的變異。如果值為 1,表示模型可解釋平均值附近回應資料的所有變異。

您也可以在 Google Cloud 控制台的模型資訊窗格中查看評估指標:

ML.EVALUATE 輸出

使用模型預測結果

現在您已評估了模型,下一步將要用此模型來預測結果,您可以對模型執行 ML.PREDICT 函式或 bigframes.bigquery.ml.predict BigQuery DataFrames 函式,預測 Biscoe Islands 所有企鵝的體重 (以公克為單位)。

SQL

ML.PREDICT 函式會採用訓練好的模型和資料集做為輸入內容,該資料集的結構定義與您用來訓練模型的資料相同,但不包含標籤欄。

執行 ML.PREDICT 查詢:

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

    前往「BigQuery」

  2. 在查詢編輯器中執行下列查詢:

    SELECT
    *
    FROM
    ML.PREDICT(MODEL `bqml_tutorial.penguins_model`,
      (
      SELECT
        *
      FROM
        `bigquery-public-data.ml_datasets.penguins`
      WHERE island = 'Biscoe'));

BigQuery DataFrames

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

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

# Load data from BigQuery
bq_df = bpd.read_gbq("bigquery-public-data.ml_datasets.penguins")

# Use 'contains' function to filter by island containing the string
# "Biscoe".
biscoe_data = bq_df[bq_df["island"].str.contains("Biscoe")]

# Use the ml.predict method to predict results using your model.
# For more information, see the BigQuery DataFrames API reference documentation:
# https://dataframes.bigquery.dev/reference/api/bigframes.bigquery.ml.predict.html#bigframes.bigquery.ml.predict
ml.predict(
    your_model_id,  # For example: "bqml_tutorial.penguins_model",
    input_=biscoe_data,
)

# Expected output results:
#     predicted_body_mass_g  	      species	                island	 culmen_length_mm  culmen_depth_mm   body_mass_g 	flipper_length_mm	sex
# 23	  4681.782896	   Gentoo penguin (Pygoscelis papua)	Biscoe	      <NA>	            <NA>	        <NA>	          <NA>	        <NA>
# 332	  4740.7907	       Gentoo penguin (Pygoscelis papua)	Biscoe	      46.2	            14.4	        214.0	          4650.0	    <NA>
# 160	  4731.310452	   Gentoo penguin (Pygoscelis papua)	Biscoe	      44.5	            14.3	        216.0	          4100.0	    <NA>

結果應大致如下:

ML.PREDICT 輸出

說明預測結果

SQL

如要瞭解模型為何會產生這些預測結果,可以使用 ML.EXPLAIN_PREDICT 函式。

ML.EXPLAIN_PREDICT 是 ML.PREDICT 函式的擴充版本。ML.EXPLAIN_PREDICT 不僅會輸出預測結果,還會輸出其他資料欄來解釋預測結果。在實際操作中,您可以執行 ML.EXPLAIN_PREDICT,而非 ML.PREDICT。詳情請參閱「BigQuery ML 可解釋 AI 總覽」。

執行 ML.EXPLAIN_PREDICT 查詢:

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

前往「BigQuery」

  1. 在查詢編輯器中執行下列查詢:
SELECT
  *
FROM
  ML.EXPLAIN_PREDICT(MODEL `bqml_tutorial.penguins_model`,
    (
    SELECT
      *
    FROM
      `bigquery-public-data.ml_datasets.penguins`
    WHERE island = 'Biscoe'),
    STRUCT(3 as top_k_features));
  1. 結果應大致如下:

    ML.EXPLAIN_PREDICT 輸出

BigQuery DataFrames

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

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

# Use the ml.explain_predict method to understand why the model is
# generating these prediction results.
# For more information, see the BigQuery DataFrames API reference documentation:
# https://dataframes.bigquery.dev/reference/api/bigframes.bigquery.ml.explain_predict.html#bigframes.bigquery.ml.explain_predict
#
# Using the trained model and utilizing data specific to Biscoe Island,
# explain the predictions of the top 3 features.
ml.explain_predict(
    your_model_id,  # For example: "bqml_tutorial.penguins_model",
    input_=biscoe_data,
    top_k_features=3,
)

# Expected results:
#   predicted_body_mass_g               top_feature_attributions	        baseline_prediction_value	prediction_value	approximation_error	              species	            island	culmen_length_mm	culmen_depth_mm	flipper_length_mm	body_mass_g	    sex
# 0	 5413.510134	        [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          5413.510134	            0.0	         Gentoo penguin (Pygoscelis papua)	Biscoe	    45.2	              16.4	        223.0	           5950.0	    MALE
# 1	 4768.351092            [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          4768.351092	            0.0	         Gentoo penguin (Pygoscelis papua)	Biscoe	    46.5	              14.5	        213.0	           4400.0	   FEMALE
# 2	 3235.896372	        [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          3235.896372	            0.0	        Adelie Penguin (Pygoscelis adeliae)	Biscoe	    37.7	              16.0          183.0	           3075.0	   FEMALE
# 3	 5349.603734	        [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          5349.603734	            0.0	         Gentoo penguin (Pygoscelis papua)	Biscoe	    46.4	              15.6	        221.0	           5000.0	    MALE
# 4	 4637.165037	        [{'feature': 'island', 'attribution': 7348.877...	-5320.222128	          4637.165037	            0.0	         Gentoo penguin (Pygoscelis papua)	Biscoe	    46.1	              13.2	        211.0	           4500.0	   FEMALE

對於線性迴歸模型,Shapley 值會用於為模型中的每個特徵產生特徵歸因值。輸出內容包含 penguins 資料表每列的前三大特徵歸因,因為 top_k_features 已設為 3。這些歸因會依歸因的絕對值遞減排序。在所有範例中,特徵 sex 對整體預測的貢獻最大。

全域解釋模型

SQL

如要瞭解哪些特徵通常最能決定企鵝體重,可以使用 ML.GLOBAL_EXPLAIN 函式。如要使用 ML.GLOBAL_EXPLAIN,您必須重新訓練模型,並將 ENABLE_GLOBAL_EXPLAIN 選項設為 TRUE。

重新訓練模型並取得全域解釋:

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

前往「BigQuery」

  1. 在查詢編輯器中執行下列查詢,重新訓練模型:

    #standardSQL
    CREATE OR REPLACE MODEL `bqml_tutorial.penguins_model`
    OPTIONS (
      model_type = 'linear_reg',
      input_label_cols = ['body_mass_g'],
      enable_global_explain = TRUE)
    AS
    SELECT
    *
    FROM
    `bigquery-public-data.ml_datasets.penguins`
    WHERE
    body_mass_g IS NOT NULL;
  2. 在查詢編輯器中執行下列查詢,取得全域解釋:

    SELECT
    *
    FROM
    ML.GLOBAL_EXPLAIN(MODEL `bqml_tutorial.penguins_model`)
  3. 結果應大致如下:

    ML.GLOBAL_EXPLAIN 輸出內容

BigQuery DataFrames

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

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

# To use the ml.global_explain method, the model must be created with
# enable_global_explain set to True.
#
# Use ml.create_model to create and train the model in BigQuery.
# The options parameter specifies the model type and the label column.
# For more information, see the BigQuery DataFrames API reference documentation:
# https://dataframes.bigquery.dev/reference/api/bigframes.bigquery.ml.create_model.html#bigframes.bigquery.ml.create_model
training_data = bq_df.dropna(subset=["body_mass_g"])
ml.create_model(
    your_model_id,  # For example: "bqml_tutorial.penguins_model",
    options={
        "model_type": "LINEAR_REG",
        "input_label_cols": ["body_mass_g"],
        "enable_global_explain": True,
    },
    training_data=training_data,
    replace=True,
)

# Use the ml.global_explain method to explain the model.
# For more information, see the BigQuery DataFrames API reference documentation:
# https://dataframes.bigquery.dev/reference/api/bigframes.bigquery.ml.global_explain.html#bigframes.bigquery.ml.global_explain
ml.global_explain(
    your_model_id,  # For example: "bqml_tutorial.penguins_model",
)

# Expected results:
#                       attribution
# feature
# island	            5737.315921
# species	            4073.280549
# sex	                622.070896
# flipper_length_mm	    193.612051
# culmen_depth_mm	    117.084944
# culmen_length_mm	    94.366793

清除所用資源

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

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

刪除資料集

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

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

    前往「BigQuery」頁面

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

  3. 按一下視窗右側的「刪除資料集」。這個動作將會刪除資料集、資料表,以及所有資料。

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

刪除專案

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

  1. 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源)

  2. 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。

後續步驟