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

BigQuery ML 支持使用逻辑回归模型类型进行监管学习。您可以使用二元逻辑回归模型类型来预测某个值是否属于两个类别之一;或者,您可以使用多类别回归模型类型来预测某个值是否属于多个类别之一。这些问题尝试将数据分为两个或更多类别,因此被称为分类问题。

在本教程中,您将在 BigQuery ML 中使用二元逻辑回归模型,在美国人口普查数据集中预测受访者的收入范围。该数据集包含 2000 年和 2010 年美国居民的受访者特征和收入信息。数据包括就业状况、职位类别、受教育程度和收入数据。

目标

在本教程中,您将执行以下任务:

  • 创建逻辑回归模型。
  • 评估逻辑回归模型。
  • 使用逻辑回归模型进行预测。

费用

本教程使用 Cloud Platform 的以下收费组件:

  • BigQuery
  • BigQuery ML

如需了解有关 BigQuery 费用的更多信息,请参阅 BigQuery 价格页面。

如需了解有关 BigQuery ML 费用的更多信息,请参阅 BigQuery ML 价格页面。

准备工作

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 新项目会自动启用 BigQuery。如需在现有项目中激活 BigQuery,请转到 启用 BigQuery API。

    启用 API

简介

机器学习中的一个常见问题是如何将数据归入两个类型(称为标签)之一。例如,某零售商可能想要根据有关给定客户的其他信息,预测该客户是否会购买新产品。在该示例中,这两个标签可能是“会购买”和“不会购买”。您可以构建您的数据集,用一列代表一个标签。您可以使用客户的位置、他们之前的购买记录、客户报告的偏好等数据来训练这样的二元逻辑回归模型。

在本教程中,您将使用 BigQuery ML 创建一个二元逻辑回归模型,用于根据美国人口普查受访者的特征特性来预测受访者的收入属于两个范围中的哪个范围。

创建逻辑回归模型包含以下步骤。

  • 第一步:创建用于存储模型的数据集。
    第一步是创建用于存储模型的 BigQuery 数据集。
  • 第二步:检查数据。
    此步骤检查数据集,并确定将哪些列用作逻辑回归模型的训练数据。
  • 第三步:选择训练数据。
    下一步是通过对 census_adult_income 表运行查询来准备用于训练二元逻辑回归模型的数据。此步骤会识别相关特征,并将其存储在视图中,以便在日后的查询中用作输入数据。
  • 第四步:创建逻辑回归模型。
    此步骤使用 CREATE MODEL 语句创建您的逻辑回归模型。
  • 第五步:使用 ML.EVALUATE 函数评估您的模型。
    然后,使用 ML.EVALUATE 函数提供有关模型性能的统计信息。
  • 第六步:使用 ML.PREDICT 函数预测参与者的收入。
    最后,使用 ML.PREDICT 函数预测一组给定人口普查参与者的收入等级。

第一步:创建数据集

第一步是创建用于存储模型的 BigQuery 数据集。如需创建数据集,请按照下列步骤操作:

  1. 在 Cloud Console 中,转到 BigQuery 页面。

    转到 BigQuery 页面

  2. 在导航面板的资源部分,点击您的项目名称。

  3. 在右侧的详细信息面板中,点击创建数据集

    创建数据集

  4. 创建数据集页面上,在数据集 ID 字段中输入 census

  5. 保留其他所有默认设置不变,然后点击创建数据集

第二步:检查数据

下一步是检查数据集,并确定将哪些列用作逻辑回归模型的训练数据。您可以使用标准 SQL 查询从数据集中返回行。

以下查询从美国人口普查数据集中返回 100 行:

SELECT
  age,
  workclass,
  marital_status,
  education_num,
  occupation,
  hours_per_week,
  income_bracket
FROM
  `bigquery-public-data.ml_datasets.census_adult_income`
LIMIT
  100;

运行查询

执行以下操作来运行从您的数据集中返回行的查询:

  1. 在 Cloud Console 中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下标准 SQL 查询:

    SELECT
      age,
      workclass,
      marital_status,
      education_num,
      occupation,
      hours_per_week,
      income_bracket
    FROM
      `bigquery-public-data.ml_datasets.census_adult_income`
    LIMIT
      100;
    
  3. 点击运行

  4. 查询完成后,点击查询文本区域下方的结果标签页。结果应如下所示:

    人口普查数据

    查询结果显示,census_adult_income 表中的 income_bracket 列只有两个值中的其中一个:<=50K>50K。此外,结果还显示,census_adult_income 表中的 educationeducation_num 列以不同的格式表示相同的数据。functional_weight 列是人口普查组织认为某个特定行所代表的个体数量;对于特定行,此列的值与 income_bracket 的值似乎无关。

第三步:选择训练数据

接下来,选择用于训练逻辑回归模型的数据。在本教程中,您根据以下特性预测人口普查受访者收入:

  • 年龄
  • 从事的工作类型
  • 婚姻状况
  • 受教育程度
  • 职业
  • 每周工作小时数

以下查询会创建一个视图,用于编译您的训练数据。本教程后面部分的 CREATE MODEL 语句包含此视图。

CREATE OR REPLACE VIEW
  `census.input_view` 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`

查询详情

此查询提取有关人口普查受访者的数据,包括 education_num(代表受访者的受教育程度)和 workclass(代表受访者从事的工作类型)。此查询排除多个数据重复的类别:例如,census_adult_income 表中的 educationeducation_num 列以不同格式表示相同的数据,因此该查询不包括 education 列。dataframe 列根据已排除的 functional_weight 列将 80% 的数据源标记用于训练,并保留剩余数据以用于评估和预测。此查询会创建一个包含这些列的视图,以便您日后用于执行训练和预测。

运行查询

执行以下步骤来运行为模型编译训练数据的查询:

  1. 在 Cloud Console 中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下标准 SQL 查询:

    CREATE OR REPLACE VIEW
      `census.input_view` 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. 点击运行

  4. 在导航面板的资源部分,点击您的项目名称。您的视图会显示在其下方。

  5. 点击您的视图。该视图的架构显示在查询编辑器下方的架构标签页中。

    查询结果

第四步:创建逻辑回归模型

现在,您已检查完训练数据,下一步是使用数据创建逻辑回归模型

您可以使用包含 'LOGISTIC_REG' 选项的 CREATE MODEL 语句创建和训练逻辑回归模型。以下查询以前面查询的视图为基础,使用 CREATE MODEL 语句训练新的二元逻辑回归模型。

CREATE OR REPLACE MODEL
  `census.census_model`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
    input_label_cols=['income_bracket']
  ) AS
SELECT
  * EXCEPT(dataframe)
FROM
  `census.input_view`
WHERE
  dataframe = 'training'

查询详情

CREATE MODEL 语句使用 SELECT 语句中的训练数据来训练模型。

OPTIONS 子句指定模型类型和训练选项。在这里,LOGISTIC_REG 选项指定逻辑回归模型类型。无需指定二元逻辑回归模型与多类别逻辑回归模型:BigQuery ML 可根据标签列中的唯一值数量来确定要训练的模型。

input_label_cols 选项指定 SELECT 语句中的哪个列将用作标签列。在这里,标签列是 income_bracket,因此模型将根据每行中的其他值来学习得出 income_bracket 的两个值中的哪一个值最有可能。

'auto_class_weights=TRUE' 选项平衡训练数据中的类别标签。默认情况下,训练数据未加权。如果训练数据中的标签不平衡,则模型可能会更频繁地学习预测最热门的标签类别。在此示例中,数据集中的大多数受访者属于较低收入等级。这可能会导致模型过于频繁地预测较低收入等级。类别权重通过计算与其频率成反比的每个类别的权重,来平衡类别标签。

SELECT 语句查询第二步中的视图。此视图仅包含以下列:包含用于训练模型的特征数据的列。WHERE 子句过滤 input_view 中的行,使训练数据中仅包含属于训练 DataFrame 的行。

运行 CREATE MODEL 查询

完成以下步骤来运行可创建逻辑回归模型的查询:

  1. 在 Cloud Console 中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下标准 SQL 查询:

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_view`
WHERE
  dataframe = 'training'
  1. 点击运行

  2. 在导航面板的资源部分中,展开 [PROJECT_ID] > census,然后点击 census_model

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

    聚类架构信息

第五步:使用 ML.EVALUATE 函数评估您的模型

创建模型后,您可以使用 ML.EVALUATE 函数评估模型的性能。ML.EVALUATE 函数根据实际数据评估预测值。

用于评估模型的查询如下所示:

SELECT
  *
FROM
  ML.EVALUATE (MODEL `census.census_model`,
    (
    SELECT
      *
    FROM
      `census.input_view`
    WHERE
      dataframe = 'evaluation'
    )
  )

查询详情

ML.EVALUATE 函数选取第一步中训练的模型和 SELECT 子查询返回的评估数据。此函数会返回有关模型的一行统计信息。此查询使用 input_view 中的数据作为评估数据。WHERE 子句过滤输入数据,使子查询仅包含 evaluation DataFrame 中的行。

运行 ML.EVALUATE 查询

执行以下操作来运行 ML.EVALUATE 查询以评估模型:

  1. 在 Cloud Console 中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下标准 SQL 查询:

    SELECT
      *
    FROM
      ML.EVALUATE (MODEL `census.census_model`,
        (
        SELECT
          *
        FROM
          `census.input_view`
        WHERE
          dataframe = 'evaluation'
        )
      )
    
  3. (可选)要设置处理位置,请依次点击更多 > 查询设置。在处理位置部分中,选择 US。此步骤是可选的,因为系统将根据数据集的位置自动检测处理位置。

    查询设置

  4. 点击运行

  5. 查询完成后,点击查询文本区域下方的结果标签页。结果应如下所示:

    ML.EVALUATE 输出

    由于您执行了逻辑回归,因此结果包含以下列:

    • precision
    • recall
    • accuracy
    • f1_score
    • log_loss
    • roc_auc

    模型的准确性是正确预测值的数量与总预测数量之比:准确性为 0.80 表示 80% 的预测正确。

第六步:使用 ML.PREDICT 函数预测收入等级

使用 ML.PREDICT 函数来识别某个特定受访者所属的收入等级。以下查询可预测 prediction DataFrame 中每个受访者的收入等级。

SELECT
  *
FROM
  ML.PREDICT (MODEL `census.census_model`,
    (
    SELECT
      *
    FROM
      `census.input_view`
    WHERE
      dataframe = 'prediction'
     )
  )

查询详情

ML.PREDICT 函数使用您的模型和 input_view 中的数据来预测结果,并对结果进行过滤,使其仅包含“prediction”DataFrame 中的行。最顶层的 SELECT 语句检索 ML.PREDICT 函数的输出。

运行 ML.PREDICT 查询

要运行 ML.PREDICT 查询,请执行以下操作:

  1. 在 Cloud Console 中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下标准 SQL 查询。

SELECT
  *
FROM
  ML.PREDICT (MODEL `census.census_model`,
    (
    SELECT
      *
    FROM
      `census.input_view`
    WHERE
      dataframe = 'prediction'
     )
  )
  1. 点击运行

  2. 查询完成后,点击查询文本区域下方的结果标签页。结果应如下所示:

    ML.PREDICT 结果

    predicted_income_bracketincome_bracket 的预测值。

(可选)第七步:使用 Explainable AI 方法说明预测结果

如需了解您的模型为何生成这些预测结果,您可以使用 ML.EXPLAIN_PREDICT 函数。

如需深入了解 BigQuery ML 中其他模型的 Shapley 值和可解释性产品,请参阅 BigQuery ML Explainable AI 概览

用于生成说明的查询如下所示:

#standardSQL
SELECT
  *
FROM
  ML.EXPLAIN_PREDICT(MODEL `census.census_model`,
    (
    SELECT
      *
    FROM
      `census.input_view`
    WHERE
      dataframe = 'evaluation'),
    STRUCT(3 as top_k_features))

运行 ML.EXPLAIN_PREDICT 查询

要运行 ML.EXPLAIN_PREDICT 查询以解释模型,请执行以下操作:

  1. 在 Cloud Console 中,点击编写新查询按钮。

  2. 查询编辑器中输入以下标准 SQL 查询。

    #standardSQL
    SELECT
    *
    FROM
    ML.EXPLAIN_PREDICT(MODEL `census.census_model`,
      (
      SELECT
        *
      FROM
        `census.input_view`
      WHERE
        dataframe = 'evaluation'),
      STRUCT(3 as top_k_features))
    
  3. 点击运行

  4. 查询完成后,点击查询编辑器下方的结果标签页。结果应如下所示:

    ML.EXPLAIN_PREDICT 输出

对于逻辑回归模型,Shapley 值用于为模型中的每个特征生成特征归因值。ML.EXPLAIN_PREDICT 会输出所提供表中每行的前 3 个特征归因,因为在查询中 top_k_features 被设为 3。这些归因按照归因的绝对值降序排列。在此示例中,第 1 行中的特征 hours_per_week 对整体预测的贡献最大,但对于此示例的第 2 行,occupation 对整体预测的贡献最大。

(可选)第八步:对模型进行全局说明

如需更好地了解模型预测其常规方式的原因,您可以使用 ML.GLOBAL_EXPLAIN 函数。为了使用 ML.GLOBAL_EXPLAIN,必须使用 ENABLE_GLOBAL_EXPLAIN=TRUE 选项重新训练模型。通过使用以下查询的此选项,重新运行训练查询:

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_view
WHERE
  dataframe = 'training'
  

通过 ML.GLOBAL_EXPLAIN 访问全球说明

用于生成全球说明的查询如下所示:

#standardSQL
SELECT
  *
FROM
  ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)

运行 ML.GLOBAL_EXPLAIN 查询

如需运行 ML.GLOBAL_EXPLAIN 查询,请执行以下步骤:

  1. 在 Cloud Console 中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下标准 SQL 查询。

    #standardSQL
    SELECT
    *
    FROM
    ML.GLOBAL_EXPLAIN(MODEL `census.census_model`)
    
  3. (可选)如需设置处理位置,请依次点击更多 > 查询设置。在处理位置部分中,选择 US。此步骤是可选的,因为系统将根据数据集的位置自动检测处理位置。

    查询设置

  4. 点击运行

  5. 查询完成后,点击查询文本区域下方的结果标签页。结果应如下所示:

    ML.GLOBAL_EXPLAIN 输出

清除数据

为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除数据集

删除项目也将删除项目中的所有数据集和所有表。如果您希望重复使用该项目,则可以删除在本教程中创建的数据集:

  1. 如有必要,请在 Cloud Console 中打开 BigQuery 页面。

    转到 BigQuery 页面

  2. 在导航窗格中,点击您创建的 census 数据集。

  3. 点击窗口右侧的删除数据集。此操作会删除数据集和模型。

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

删除项目

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

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

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

后续步骤