在人口普查資料上建立及使用分類模型


在本教學課程中,您將在 BigQuery ML 中使用二元邏輯迴歸模型,根據受訪者的受眾特徵資料,預測他們的收入範圍。二元邏輯迴歸模型會預測某值是否屬於兩個類別之一,在本例中,就是個人年收入是否超過或低於 $50,000 美元。

本教學課程使用 bigquery-public-data.ml_datasets.census_adult_income 資料集。這個資料集包含從 2000 年到 2010 年美國居民的人口和收入資訊。

目標

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

  • 建立邏輯迴歸模型。
  • 評估模型。
  • 使用模型進行預測。
  • 說明模型產生的結果。

費用

本教學課程使用 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

簡介

機器學習中常見的任務,就是將資料分類為兩種型別 (稱為「標籤」) 之一。舉例來說,零售商可能會想要根據某個特定客戶的相關資訊,預測該客戶是否會購買某個新產品。在這種情況下,兩個標籤可能是 will buywon't buy。零售商可以建構資料集,讓一個資料欄代表兩個標籤,並包含客戶資訊,例如客戶的位置、先前購買的商品,以及他們回報的偏好。零售商接著可以使用二元邏輯迴歸模型,利用這些客戶資訊預測最能代表每位客戶的標籤。

在本教學課程中,您將建立二元邏輯迴歸模型,根據受訪者的受眾特徵屬性,預測美國人口普查受訪者的收入是否屬於兩個範圍之一。

建立資料集

建立 BigQuery 資料集來儲存模型:

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

    前往 BigQuery

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

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

    建立資料集。

  4. 在「Create dataset」頁面上執行下列操作:

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

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

      公開資料集儲存在 US 多地區中。為簡單起見,請將資料集儲存在相同位置。

    • 保留其餘預設設定,然後點選「Create dataset」(建立資料集)

檢查資料

檢查資料集,然後找出要使用哪些資料欄做為邏輯迴歸模型的訓練資料。從 census_adult_income 資料表中選取 100 列:

SQL

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

    前往 BigQuery

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

    SELECT
    age,
    workclass,
    marital_status,
    education_num,
    occupation,
    hours_per_week,
    income_bracket,
    functional_weight
    FROM
    `bigquery-public-data.ml_datasets.census_adult_income`
    LIMIT
    100;
  3. 結果如下所示:

    人口普查資料

BigQuery DataFrames

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

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

import bigframes.pandas as bpd

df = bpd.read_gbq(
    "bigquery-public-data.ml_datasets.census_adult_income",
    columns=(
        "age",
        "workclass",
        "marital_status",
        "education_num",
        "occupation",
        "hours_per_week",
        "income_bracket",
        "functional_weight",
    ),
    max_results=100,
)
df.peek()
# Output:
# age      workclass       marital_status  education_num          occupation  hours_per_week income_bracket  functional_weight
#  47      Local-gov   Married-civ-spouse             13      Prof-specialty              40           >50K             198660
#  56        Private        Never-married              9        Adm-clerical              40          <=50K              85018
#  40        Private   Married-civ-spouse             12        Tech-support              40           >50K             285787
#  34   Self-emp-inc   Married-civ-spouse              9        Craft-repair              54           >50K             207668
#  23        Private   Married-civ-spouse             10   Handlers-cleaners              40          <=50K              40060

查詢結果顯示 census_adult_income 資料表中的 income_bracket 資料欄只有以下兩個值其中之一:<=50K>50Kfunctional_weight 欄是人口普查機構認為某個特定資料列所代表的個體數。這個欄的值似乎與特定資料列的 income_bracket 值無關。

準備範例資料

在本教學課程中,您將根據下列屬性預測人口普查受訪者的收入:

  • 年齡
  • 從事的工作類型
  • 婚姻狀態
  • 教育程度
  • 職業
  • 每週工作時數

如要建立這項預測,您必須從 census_adult_income 資料表中人口普查的回覆者資料中擷取資訊。選取地圖項目欄,包括:

  • education_num,代表受訪者的教育程度
  • workclass:代表受訪者執行的工作類型

排除重複資料的資料欄。例如:

  • education,因為 educationeducation_num 以不同格式表示相同的資料

建立由 functional_weight 資料欄衍生的新 dataframe 資料欄,將資料分割為訓練、評估和預測集。將 80% 的資料來源標示為訓練模型專用,並將其餘 20% 的資料保留為評估和預測專用。

SQL

如要準備範例資料,請建立檢視畫面來容納訓練資料。這個檢視畫面會在本教學課程後續的 CREATE MODEL 陳述式中使用。

執行準備範例資料的查詢:

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

    前往 BigQuery

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

    CREATE OR REPLACE VIEW
    `census.input_data` AS
    SELECT
    age,
    workclass,
    marital_status,
    education_num,
    occupation,
    hours_per_week,
    income_bracket,
    CASE
      WHEN MOD(functional_weight, 10) < 8 THEN 'training'
      WHEN MOD(functional_weight, 10) = 8 THEN 'evaluation'
      WHEN MOD(functional_weight, 10) = 9 THEN 'prediction'
    END AS dataframe
    FROM
    `bigquery-public-data.ml_datasets.census_adult_income`
  3. 在「Explorer」窗格中展開 census 資料集,然後找出 input_data 檢視畫面。

  4. 按一下檢視名稱,開啟資訊窗格。檢視表結構定義會顯示在「結構定義」分頁中。

查詢結果

BigQuery DataFrames

建立名為 input_dataDataFrame。您會在本教學課程後面使用 input_data 訓練模型、評估模型,並進行預測。

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

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

import bigframes.pandas as bpd

input_data = bpd.read_gbq(
    "bigquery-public-data.ml_datasets.census_adult_income",
    columns=(
        "age",
        "workclass",
        "marital_status",
        "education_num",
        "occupation",
        "hours_per_week",
        "income_bracket",
        "functional_weight",
    ),
)
input_data["dataframe"] = bpd.Series("training", index=input_data.index,).case_when(
    [
        (((input_data["functional_weight"] % 10) == 8), "evaluation"),
        (((input_data["functional_weight"] % 10) == 9), "prediction"),
    ]
)
del input_data["functional_weight"]

建立邏輯迴歸模型

使用您在上一節標示的訓練資料,建立邏輯迴歸模型。

SQL

使用 CREATE MODEL 陳述式,並為模型類型指定 LOGISTIC_REG

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

  • input_label_cols 選項會指定 SELECT 陳述式中的哪個資料欄做為標籤資料欄。這裡的標籤資料欄為 income_bracket,因此模型會根據該列中呈現的其他值,學習 income_bracket 的兩個值中哪一個最有可能出現在該列。

  • 您不需要指定邏輯迴歸模型是二元還是多元類別。BigQuery 可根據標籤資料欄中不重複值的數量,判斷要訓練哪一種模型。

  • auto_class_weights 選項會設為 TRUE,以平衡訓練資料中的類別標籤。預設情況下,訓練資料並未加權。如果訓練資料中的標籤不平衡,則模型學習到的權重可能不均,導致最熱門的標籤類別預測比例過高。在這種情況下,由於資料集中的大多數受訪者屬於較低的收入水平,所以模型預測較低收入水平的權重可能會因而過重。系統會透過與類別出現頻率成反比的方式,來計算每個類別的權重,藉此平衡各類別標籤的權重。

  • SELECT 陳述式會查詢包含訓練資料的 input_data 檢視畫面。WHERE 子句會篩選 input_data 中的資料列,只有標示為訓練資料的資料列會用於訓練模型。

執行可建立邏輯迴歸模型的查詢:

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

    前往 BigQuery

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

    CREATE OR REPLACE MODEL
    `census.census_model`
    OPTIONS
    ( model_type='LOGISTIC_REG',
      auto_class_weights=TRUE,
      data_split_method='NO_SPLIT',
      input_label_cols=['income_bracket'],
      max_iterations=15) AS
    SELECT * EXCEPT(dataframe)
    FROM
    `census.input_data`
    WHERE
    dataframe = 'training'
  3. 在「Explorer」窗格中,依序展開 census 資料集和「Models」資料夾。

  4. 按一下 census_model 模型,開啟資訊窗格。

  5. 按一下 [Schema] (結構定義) 分頁標籤。模型結構定義會列出 BigQuery ML 用來執行邏輯迴歸的屬性。結構定義應如下所示:

叢集結構定義資訊

BigQuery DataFrames

請使用 fit 方法訓練模型,並使用 to_gbq 方法將模型儲存至資料集。

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

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

import bigframes.ml.linear_model

# input_data is defined in an earlier step.
training_data = input_data[input_data["dataframe"] == "training"]
X = training_data.drop(columns=["income_bracket", "dataframe"])
y = training_data["income_bracket"]

census_model = bigframes.ml.linear_model.LogisticRegression(
    # Balance the class labels in the training data by setting
    # class_weight="balanced".
    #
    # By default, the training data is unweighted. If the labels
    # in the training data are imbalanced, the model may learn to
    # predict the most popular class of labels more heavily. In
    # this case, most of the respondents in the dataset are in the
    # lower income bracket. This may lead to a model that predicts
    # the lower income bracket too heavily. Class weights balance
    # the class labels by calculating the weights for each class in
    # inverse proportion to the frequency of that class.
    class_weight="balanced",
    max_iterations=15,
)
census_model.fit(X, y)

census_model.to_gbq(
    your_model_id,  # For example: "your-project.census.census_model"
    replace=True,
)

評估模型效能

建立模型後,請根據實際資料評估模型效能。

SQL

ML.EVALUATE 函式會根據實際資料,評估模型產生的預測值。

針對輸入內容,ML.EVALUATE 函式會採用已訓練的模型,以及 input_data 檢視畫面中 evaluation 做為 dataframe 資料欄值的資料列。該函式會傳回模型相關統計資料的單一資料列。

執行 ML.EVALUATE 查詢:

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

    前往 BigQuery

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

    SELECT
    *
    FROM
    ML.EVALUATE (MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'
      )
    )
  3. 結果如下所示:

    ML.EVALUATE 輸出

BigQuery DataFrames

使用 score 方法,根據實際資料評估模型。

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

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

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

# input_data is defined in an earlier step.
evaluation_data = input_data[input_data["dataframe"] == "evaluation"]
X = evaluation_data.drop(columns=["income_bracket", "dataframe"])
y = evaluation_data["income_bracket"]

# The score() method evaluates how the model performs compared to the
# actual data. Output DataFrame matches that of ML.EVALUATE().
score = census_model.score(X, y)
score.peek()
# Output:
#    precision    recall  accuracy  f1_score  log_loss   roc_auc
# 0   0.685764  0.536685   0.83819  0.602134  0.350417  0.882953

您也可以在 Google Cloud 主控台中查看模型資訊窗格,查看訓練期間計算的評估指標:

ML.EVALUATE 輸出

預測收入區間

使用模型找出特定受訪者可能屬於的收入水平。

SQL

使用 ML.PREDICT 函式預測可能的收入區間。輸入經過訓練的模型,以及 input_data 檢視畫面中列出 prediction 做為 dataframe 欄值的資料列。

執行 ML.PREDICT 查詢:

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

    前往 BigQuery

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

    SELECT
    *
    FROM
    ML.PREDICT (MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'prediction'
      )
    )
  3. 結果如下所示:

    ML.PREDICT 結果

predicted_income_bracketincome_bracket 的預測值。

BigQuery DataFrames

使用 predict 方法,預測可能的收入區間。

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

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

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

# input_data is defined in an earlier step.
prediction_data = input_data[input_data["dataframe"] == "prediction"]

predictions = census_model.predict(prediction_data)
predictions.peek()
# Output:
#           predicted_income_bracket                     predicted_income_bracket_probs  age workclass  ... occupation  hours_per_week income_bracket   dataframe
# 18004                    <=50K  [{'label': ' >50K', 'prob': 0.0763305999358786...   75         ?  ...          ?               6          <=50K  prediction
# 18886                    <=50K  [{'label': ' >50K', 'prob': 0.0448866871906495...   73         ?  ...          ?              22           >50K  prediction
# 31024                    <=50K  [{'label': ' >50K', 'prob': 0.0362982319421936...   69         ?  ...          ?               1          <=50K  prediction
# 31022                    <=50K  [{'label': ' >50K', 'prob': 0.0787836112058324...   75         ?  ...          ?               5          <=50K  prediction
# 23295                    <=50K  [{'label': ' >50K', 'prob': 0.3385373037905673...   78         ?  ...          ?              32          <=50K  prediction

說明預測結果

如要瞭解模型為何產生這些預測結果,您可以使用 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

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

    SELECT
    *
    FROM
    ML.EXPLAIN_PREDICT(MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_data`
      WHERE
        dataframe = 'evaluation'),
      STRUCT(3 as top_k_features))
  3. 結果如下所示:

    ML.EXPLAIN_PREDICT 輸出

對於邏輯迴歸模型,夏普利值可用於為模型中的每個特徵產生特徵歸因值。ML.EXPLAIN_PREDICT 會輸出 input_data 檢視畫面每列的前三個功能歸因,因為 top_k_features 在查詢中已設為 3。這些歸因會依歸因的絕對值由大至小排序。在本例的第 1 列中,特徵 hours_per_week 對整體預測的貢獻最大,但在第 2 列中,occupation 對整體預測的貢獻最大。

全局解釋模型

如要瞭解哪些特徵通常對收入等級的判斷最為重要,您可以使用 ML.GLOBAL_EXPLAIN 函式。如要使用 ML.GLOBAL_EXPLAIN,您必須將 ENABLE_GLOBAL_EXPLAIN 選項設為 TRUE,並重新訓練模型。

重新訓練模型並取得全域說明:

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

    前往 BigQuery

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

    CREATE OR REPLACE MODEL `census.census_model`
    OPTIONS
      ( model_type='LOGISTIC_REG',
        auto_class_weights=TRUE,
        enable_global_explain=TRUE,
        input_label_cols=['income_bracket']
      ) AS
    SELECT * EXCEPT(dataframe)
    FROM
      `census.input_data`
    WHERE
      dataframe = 'training'
  3. 在查詢編輯器中執行下列查詢,取得全域說明:

    SELECT
      *
    FROM
      ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)
  4. 結果如下所示:

    ML.GLOBAL_EXPLAIN 輸出

清除所用資源

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

刪除資料集

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

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

    前往「BigQuery」頁面

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

  3. 按一下視窗右側的「Delete dataset」。這個動作會刪除資料集和模型。

  4. 在「Delete dataset」(刪除資料集) 對話方塊中,輸入資料集的名稱 (census),然後按一下 [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.

後續步驟