使用 TRANSFORM 子句执行特征工程

本教程介绍了如何使用 CREATE MODEL 语句的 TRANSFORM 子句在创建和训练模型的同时执行特征工程。借助 TRANSFORM 子句,您可以指定一个或多个预处理函数来转换用于训练模型的输入数据。当您将模型与 ML.EVALUATEML.PREDICT 函数搭配使用时,系统会自动应用您对模型应用的预处理。

本教程使用公开的 bigquery-public-data.ml_datasets.penguin 数据集

创建数据集

创建 BigQuery 数据集以存储机器学习模型。

控制台

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery 页面

  2. 探索器窗格中,点击您的项目名称。

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

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

    • 数据集 ID 部分,输入 bqml_tutorial

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

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

bq

如需创建新数据集,请使用带有 --location 标志的 bq mk 命令。 如需查看完整的潜在参数列表,请参阅 bq mk --dataset 命令参考文档。

  1. 创建一个名为 bqml_tutorial 的数据集,并将数据位置设置为 US,说明为 BigQuery ML tutorial dataset

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    该命令使用的不是 --dataset 标志,而是 -d 快捷方式。如果省略 -d--dataset,该命令会默认创建一个数据集。

  2. 确认已创建数据集:

    bq ls

API

使用已定义的数据集资源调用 datasets.insert 方法。

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrame

在尝试此示例之前,请按照《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)

创建模型

创建一个线性回归模型来预测企鹅体重,并根据 penguins 示例表对其进行训练。

OPTIONS(model_type='linear_reg', input_label_cols=['body_mass_g']) 子句表示您正在创建线性回归模型。线性回归模型根据输入特征的线性组合生成连续值。body_mass_g 列为输入标签列。对于线性回归模型来说,标签列必须为实值(列值必须是实数)。

此查询的 TRANSFORM 子句使用 SELECT 语句中的以下列:

  • body_mass_g:无需任何更改即可用于训练。
  • culmen_depth_mm:无需任何更改即可用于训练。
  • flipper_length_mm:无需任何更改即可用于训练。
  • bucketized_culmen_length:生成自 culmen_length_mm,方法是使用 ML.QUANTILE_BUCKETIZE() 分析函数根据分位数对 culmen_length_mm 进行分桶。
  • culmen_length_mm:原始 culmen_length_mm 值,转换为 STRING 值并用于训练。
  • species_sex:通过使用 ML.FEATURE_CROSS 函数组合 speciessex 来生成。

您无需在 TRANSFORM 子句中使用训练表中的所有列。

WHERE 子句 (WHERE body_mass_g IS NOT NULL AND RAND() < 0.2) 不包括企鹅体重为 NULL 的行,并使用 RAND 函数抽取数据的随机示例。

请按照以下步骤创建模型:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    CREATE OR REPLACE MODEL `bqml_tutorial.penguin_transform`
      TRANSFORM(
        body_mass_g,
        culmen_depth_mm,
        flipper_length_mm,
        ML.QUANTILE_BUCKETIZE(culmen_length_mm, 10) OVER () AS bucketized_culmen_length,
        CAST(culmen_length_mm AS string) AS culmen_length_mm,
        ML.FEATURE_CROSS(STRUCT(species, sex)) AS species_sex)
      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
      AND RAND() < 0.2;

    查询大约需要 15 分钟才能完成,之后 penguin_transform 模型会显示在探索器窗格中。由于查询使用 CREATE MODEL 语句来创建模型,因此您看不到查询结果。

评估模型

使用 ML.EVALUATE 函数评估模型的性能。ML.EVALUATE 函数根据模型返回的预测企鹅体重来评估来自训练数据的实际企鹅体重。

此查询的嵌套 SELECT 语句和 FROM 子句与 CREATE MODEL 查询中的相同。由于您在创建模型时使用了 TRANSFORM 子句,因此无需在 ML.EVALUATE 函数中再次指定列和转换。该函数会自动从模型中检索这些信息。

请按照以下步骤评估模型:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

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

    结果应如下所示:

    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    | mean_absolute_error | mean_squared_error | mean_squared_log_error | median_absolute_error |      r2_score      | explained_variance |
    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    |   64.21134350607677 | 13016.433317859564 |   7.140935762696211E-4 |     15.31788461553515 | 0.9813042531507734 | 0.9813186268757634 |
    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    

    评估结果中的一项重要指标为 R2 得分。R2 得分为统计测量结果,用于确定线性回归预测是否接近实际数据。0 值表示该模型未能说明响应数据相对于平均值的可变性。1 值表示该模型说明了响应数据相对于平均值的所有可变性。

    如需详细了解 ML.EVALUATE 函数输出,请参阅输出

    您也可以在不提供输入数据的情况下调用 ML.EVALUATE。它将使用在训练期间计算得出的评估指标。

使用模型预测企鹅体重

将该模型与 ML.PREDICT 函数搭配使用来预测雄性企鹅的体重。

ML.PREDICT 函数会在 predicted_label_column_name 列中输出预测值,在本例中为 predicted_body_mass_g

使用 ML.PREDICT 函数时,您不必传入模型训练中使用的所有列。只需要在 TRANSFORM 子句中使用的列。与 ML.EVALUATE 类似,ML.PREDICT 函数会自动从模型中检索 TRANSFORM 列和转换。

请按照以下步骤从模型中获取预测结果:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    SELECT
      predicted_body_mass_g
    FROM
      ML.PREDICT(
        MODEL `bqml_tutorial.penguin_transform`,
        (
          SELECT
            *
          FROM
            `bigquery-public-data.ml_datasets.penguins`
          WHERE
            sex = 'MALE'
        ));

    结果应如下所示:

    +-----------------------+
    | predicted_body_mass_g |
    +-----------------------+
    |    2810.2868541725757 |
    +-----------------------+
    |    3813.6574220842676 |
    +-----------------------+
    |     4098.844698262214 |
    +-----------------------+
    |     4256.587135004173 |
    +-----------------------+
    |     3008.393497302691 |
    +-----------------------+
    |     ...               |
    +-----------------------+