基于人口普查数据构建和使用分类模型


在本教程中,您将在 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. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  2. 确保您的 Google Cloud 项目已启用结算功能

  3. 启用 BigQuery API。

    启用 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. 探索器窗格中,点击您的项目名称。

  3. 点击 查看操作 > 创建数据集

    创建数据集。

  4. 创建数据集页面上,执行以下操作:

    • 数据集 ID 部分,输入 census

    • 位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。

      公共数据集存储在 US 多区域中。为简单起见,请将数据集存储在同一位置。

    • 保持其余默认设置不变,然后点击创建数据集

检查数据

检查数据集,并确定将哪些列用作逻辑回归模型的训练数据。从 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 DataFrame

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

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. 探索器窗格中,展开 census 数据集并找到 input_data 视图。

  4. 点击视图名称以打开信息窗格。视图架构会显示在架构标签页中。

查询结果

BigQuery DataFrame

创建名为 input_dataDataFrame。在本教程的后面部分,您将使用 input_data 来训练、评估模型并进行预测。

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

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. 探索器窗格中,展开 census 数据集,然后展开模型文件夹。

  4. 点击 census_model 模型,打开信息窗格。

  5. 点击架构标签页。模型架构列出了 BigQuery ML 用于执行逻辑回归的特性。架构应类似如下所示:

聚类架构信息

BigQuery DataFrame

使用 fit 方法训练模型,并使用 to_gbq 方法将其保存到数据集。

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

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 DataFrame

使用 score 方法根据实际数据评估模型。

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

# 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 DataFrame

使用 predict 方法预测可能的收入等级。

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

# 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 Explainable 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 输出

对于逻辑回归模型,Shapley 值用于为模型中的每个特征生成特征归因值。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. 点击窗口右侧的删除数据集。此操作会删除数据集和模型。

  4. 删除数据集对话框中,输入您的数据集的名称 (census),然后点击删除以确认删除命令。

删除项目

要删除项目,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤