ML.PREDICT 函数

ML.PREDICT 函数

ML.PREDICT 函数可用于使用模型来预测结果。预测可在模型创建期间、模型创建之后或失败之后(至少完成一次迭代)进行。ML.PREDICT 始终使用上次成功迭代的模型权重。

ML.PREDICT 函数的输出中,行数与输入表的行数相同,它还包括输入表中的所有列和模型中的所有输出列。此模型的输出列名称为 predicted_<label_column_name>;对于逻辑回归模型,名称为 predicted_<label_column_name>_probs。在这两列中,label_column_name 是训练期间使用的输入标签列的名称。

  • 对于逻辑回归模型:

    • predicted_<label_column_name>_probs 输出列是由类型为 [<label, prob>] 的 STRUCT 构成的数组,其中包含每个标签的预测概率。
    • predicted_<label_column_name> 输出列是两个输入标签中的一个,具体取决于哪个标签的预测概率更高。
  • 对于多类别逻辑回归模型:

    • predicted_<label_column_name>_probs 输出列是使用 softmax 函数计算的每个类别标签的概率。
    • predicted_<label_column_name> 输出列是预测概率得分最高的标签。
  • 对于线性回归模型:

    • predicted_<label_column_name> 输出列是标签的预测值。
  • 对于 k-means 模型:

    • 返回标有 centroid_idnearest_centroids_distance 的列。nearest_centroids_distance 包含一个由名为 nearest_centroids_distance 的 STRUCT 构成的 ARRAY,其中包含与最近的 k 集群的距离,其中 k 等于 num_clusters 或 5(以较小者为准)。如果创建此模型时将选项 standardize_features 设置为 TRUE,则模型使用标准化特征计算这些距离;否则,根据非标准化特征计算这些距离。
  • 对于 TensorFlow 模型:

    • 输入必须可转换为模型预期的类型。
    • 输出是 TensorFlow 模型的预测方法的输出。

ML.PREDICT 权限

运行 ML.PREDICT 时需要 bigquery.models.createbigquery.models.getData

ML.PREDICT 语法

ML.PREDICT(MODEL model_name,
          {TABLE table_name | (query_statement)}
          [, STRUCT<threshold FLOAT64> settings)])

model_name

model_name 是要评估的模型的名称。如果您没有配置默认项目,请按照以下格式将项目 ID 添加到模型名称前面:`[PROJECT_ID].[DATASET].[MODEL]`(包括反引号);例如:`myproject.mydataset.mymodel`。

table_name

table_name 是包含评估数据的输入表的名称。如果您没有配置默认项目,请按照以下格式将项目 ID 添加到表名称前面:`[PROJECT_ID].[DATASET].[TABLE]`(包括反引号);例如:`myproject.mydataset.mytable`。

表中输入列的名称必须包含模型中的列名称,并且根据 BigQuery 隐式强制转换规则,它们的类型应兼容。

如果表中存在未使用的列,则它们将传递到输出列。

query_statement

query_statement 子句指定用于生成评估数据的标准 SQL 查询。请参阅标准 SQL 查询语法页面,了解 query_statement 子句支持的 SQL 语法。

查询中输入列的名称必须包含模型中的列名称,并且根据 BigQuery 隐式强制转换规则,它们的类型应兼容。

如果查询中存在未使用的列,则它们将传递到输出列。

如果创建 model_nameCREATE MODEL 语句中存在 TRANSFORM 子句,则只有 TRANSFORM 子句中的输入列必须出现在 query_statement 中。

threshold

(可选)Threshold 是二元逻辑回归模型的自定义阈值,用作两个标签之间的临界值。高于阈值的预测将被视为正例预测。低于阈值的预测是负例预测。阈值的类型为 FLOAT64,是设置 STRUCT 的一部分。默认值为 0.5。

插补

在统计学上,插补使用替换值来取代缺失的数据。在 BigQuery ML 中训练模型时,NULL 值被视为缺失的数据。在 BigQuery ML 中预测结果时,如果 BigQuery ML 遇到 NULL 值或之前未见过的值,则表示出现缺失值。BigQuery ML 会根据列是数值列、独热编码列还是时间戳列来处理缺失的数据。

数值列

在训练和预测中,数值列中的 NULL 值被替换为根据原始输入数据中的特征列计算得出的中值。

独热/多热编码列

在训练和预测中,编码列中的 NULL 值映射到数据中添加的额外类别。在预测期间,系统为之前未见过的数据分配的权重为 0。

时间戳列

TIMESTAMP 列混合使用标准化列和独热编码列的插补方法。对于生成的 unix 时间列,BigQuery ML 将值替换为原始列中的 unix 时间中值。对于其他生成的值,BigQuery ML 将值分配给每个已提取特征的相应 NULL 类别。

STRUCT 列

在训练和预测中,STRUCT 的每个字段均根据其类型进行计算。

ML.PREDICT 示例

以下示例假定您的模型和输入表位于默认项目中。

预测结果

以下查询使用 ML.PREDICT 函数来预测结果。查询返回以下列:

  • predicted_label
  • label
  • column1
  • column2
SELECT
  *
FROM
  ML.PREDICT(MODEL `mydataset.mymodel`,
    (
    SELECT
      label,
      column1,
      column2
    FROM
      `mydataset.mytable`))

比较来自两个不同模型的预测

在此示例中,以下查询用于创建第一个模型。

CREATE MODEL
  `mydataset.mymodel1`
OPTIONS
  (model_type='linear_reg',
    input_label_cols=['label'],
  ) AS
SELECT
  label,
  input_column1
FROM
  `mydataset.mytable`

以下查询用于创建第二个模型。

CREATE MODEL
  `mydataset.mymodel2`
OPTIONS
  (model_type='linear_reg',
    input_label_cols=['label'],
  ) AS
SELECT
  label,
  input_column2
FROM
  `mydataset.mytable`

以下查询使用 ML.PREDICT 函数来比较两个模型的输出。

SELECT
  label,
  predicted_label1,
  predicted_label AS predicted_label2
FROM
  ML.PREDICT(MODEL `mydataset.mymodel2`,
    (
    SELECT
      * EXCEPT (predicted_label),
          predicted_label AS predicted_label1
    FROM
      ML.PREDICT(MODEL `mydataset.mymodel1`,
        TABLE `mydataset.mytable`)))

指定自定义阈值

以下查询通过指定输入数据和自定义阈值 0.55 来使用 ML.PREDICT 函数。

SELECT
  *
FROM
  ML.PREDICT(MODEL `mydataset.mymodel`,
    (
    SELECT
      custom_label,
      column1,
      column2
    FROM
      `mydataset.mytable`),
    STRUCT(0.55 AS threshold))

使用导入的 TensorFlow 模型预测结果

以下查询使用 ML.PREDICT 函数以利用导入的 TensorFlow 模型预测结果。input_data 表包含 my_model 预期的架构中的输入。如需了解详情,请参阅用于 TensorFlow 模型的 CREATE MODEL 语句

SELECT *
FROM ML.PREDICT(MODEL `my_project`.my_dataset.my_model,
               (SELECT * FROM input_data))

使用 TRANSFORM 子句训练的模型预测结果

以下查询使用 TRANSFORM 子句训练模型:

CREATE MODEL m
  TRANSFORM(f1 + f2 as c, label)
  OPTIONS(...)
AS SELECT f1, f2, f3, label FROM t;

由于 TRANSFORM 子句中未出现 f3 列,因此以下预测查询在 query_statement 中省略了该列。

SELECT * FROM ML.PREDICT(
  MODEL m, (SELECT f1, f2 FROM t1));

如果 SELECT 语句中提供了 f3,则它不用于对预测进行计算,而是经传递后用于 SQL 语句的其余部分。