使用 BigQuery ML 預測企鵝重量


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

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

目標

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

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

費用

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

  • BigQuery
  • BigQuery ML

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

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

事前準備

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

    Go to project selector

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

  3. Enable the BigQuery API.

    Enable the 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」窗格中,按一下專案名稱。

  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)

建立模型

使用 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 秒。如要查看模型,請前往「Explorer」窗格,展開 bqml_tutorial 資料集,然後展開「Models」資料夾。

BigQuery DataFrames

在嘗試這個範例之前,請先參閱 BigQuery 快速入門:使用 BigQuery DataFrames,按照 BigQuery DataFrames 設定說明進行操作。詳情請參閱 BigQuery DataFrames 參考資料說明文件

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

from bigframes.ml.linear_model import LinearRegression
import bigframes.pandas as bpd

# 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"])

# Specify your feature (or input) columns and the label (or output) column:
feature_columns = training_data.drop(columns=["body_mass_g"])
label_columns = training_data[["body_mass_g"]]

# Create the linear model
model = LinearRegression()
model.fit(feature_columns, label_columns)
model.to_gbq(
    your_model_id,  # For example: "bqml_tutorial.penguins_model"
    replace=True,
)

建立模型大約需要 30 秒。如要查看模型,請前往「Explorer」窗格,展開 bqml_tutorial 資料集,然後展開「Models」資料夾。

取得訓練統計資料

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

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

損失是指不良預測造成的負面影響。這個數值可顯示模型在單一例子中的預測表現多差。如果這個模型的預測是完美的,則損失為 0,否則損失會大於 0。訓練模型的目的是從所有例子中找到平均損失分數低的一組權重和偏誤。

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

  1. 在「Explorer」窗格中,展開 bqml_tutorial 資料集,然後展開「Models」資料夾。按一下「penguins_model」penguins_model,開啟模型資訊窗格。

  2. 依序點選「Training」分頁標籤和「Table」。結果應如下所示:

    ML.TRAINING_INFO 輸出

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

評估模型

建立模型後,請使用 ML.EVALUATE 函式score 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 快速入門:使用 BigQuery DataFrames,按照 BigQuery DataFrames 設定說明進行操作。詳情請參閱 BigQuery DataFrames 參考資料說明文件

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

import bigframes.pandas as bpd

# Select the model you will be evaluating. `read_gbq_model` loads model data from
# BigQuery, but you could also use the `model` object from the previous steps.
model = bpd.read_gbq_model(
    your_model_id,  # For example: "bqml_tutorial.penguins_model"
)

# Score the model with input data defined in an earlier step to compare
# model predictions on feature_columns to true labels in label_columns.
score = model.score(feature_columns, label_columns)
# 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 函式predict BigQuery DataFrames 函式,預測 Biscoe 群島上所有企鵝的體重 (以公克為單位)。

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 快速入門:使用 BigQuery DataFrames,按照 BigQuery DataFrames 設定說明進行操作。詳情請參閱 BigQuery DataFrames 參考資料說明文件

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

# Select the model you'll use for predictions. `read_gbq_model` loads
# model data from BigQuery, but you could also use the `model` object
# object from previous steps.
model = bpd.read_gbq_model(
    your_model_id,
    # For example: "bqml_tutorial.penguins_model",
)

# 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.loc[bq_df["island"].str.contains("Biscoe")]

result = model.predict(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_PREDICTML.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 快速入門:使用 BigQuery DataFrames,按照 BigQuery DataFrames 設定說明進行操作。詳情請參閱 BigQuery DataFrames 參考資料說明文件

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

# Use 'predict_explain' function to understand why the model is generating these prediction results.
# 'predict_explain'is an extended version of the 'predict' function that not only outputs prediction results, but also outputs additional columns to explain the prediction results.
# Using the trained model and utilizing data specific to Biscoe Island, explain the predictions of the top 3 features
explained = model.predict_explain(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

對於線性迴歸模型,夏普利值會用於為模型中的每個特徵產生特徵歸因值。由於 top_k_features 已設為 3,因此輸出結果會包含 penguins 資料表每列的前三個特徵歸因。這些歸因會依歸因的絕對值由大至小排序。在所有範例中,特徵 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 快速入門:使用 BigQuery DataFrames,按照 BigQuery DataFrames 設定說明進行操作。詳情請參閱 BigQuery DataFrames 參考資料說明文件

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

# To use the `global_explain()` function, the model must be recreated with `enable_global_explain` set to `True`.
model = LinearRegression(enable_global_explain=True)

# The model must the be fitted before it can be saved to BigQuery and then explained.
training_data = bq_df.dropna(subset=["body_mass_g"])
X = training_data.drop(columns=["body_mass_g"])
y = training_data[["body_mass_g"]]
model.fit(X, y)
model.to_gbq("bqml_tutorial.penguins_model", replace=True)

# Explain the model
explain_model = model.global_explain()

# 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. 按一下視窗右側的「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.

後續步驟