CREATE MODEL 语句

BigQuery ML 中的模型

BigQuery ML 中的模型表示机器学习系统从训练数据中学到的内容。

BigQuery ML 支持两种类型的模型:

  • 用于预测的线性回归 - 例如,给定日期的商品销售额。标签为实值(不能为 +/- 无穷大或 NaN)。
  • 用于分类的二元逻辑回归 - 例如,确定客户是否会购买。标签必须只有两个可能的值。

在 BigQuery ML 中,可以将模型与多个 BigQuery 数据集中的数据一起用于训练和预测。

创建模型时,分类变量在训练和预测过程中(类型为 BOOLSTRINGBYTESDATEDATETIMETIME)默认为独热编码

TIMESTAMP 当前不是默认的独热编码。可使用 CAST 函数将 TIMESTAMP 列转换为 STRING,以便 BigQuery ML 将列视为分类。

对于独热编码功能,每个列值都是采用下列格式的结构数组:[<String_Value, Weight>]。数组的长度是该功能的基数(值的数量)。功能是用于进行预测的输入变量。

默认情况下,数字变量(类型为 NUMERICFLOAT64INT64)是标准化的。此外,在预测过程中,系统会自动应用标准化。

CREATE MODEL 语句

要在 BigQuery 中创建模型,请使用 BigQuery ML CREATE MODEL 语句。此语句与 CREATE TABLE DDL 语句类似。当您运行包含 CREATE MODEL 语句的标准 SQL 查询时,系统将为您生成处理该查询的查询作业

CREATE MODEL 限制

BigQuery ML CREATE MODEL 语句受到以下限制:

  • 您使用 CREATE MODEL 语句时,模型的大小不得超过 90 MB,否则查询会失败。通常,如果所有分类变量均为短字符串,则系统可支持总共 5-10 MB 的功能基数(模型维度)。维度取决于字符串变量的基数和长度。
  • 使用 CREATE MODEL 语句时,标签列不能包含“NULL”值。如果标签列包含 NULL 值,则查询会失败。
  • 目前,CREATE MODEL IF NOT EXISTS 子句会随时更新模型的上次修改时间戳。
  • 目前,东京地区不支持 CREATE OR REPLACE MODEL 子句。
  • 东京地区不支持使用 warm_start 选项的 CREATE MODEL 语句。

CREATE MODEL 语法

{CREATE MODEL | CREATE MODEL IF NOT EXISTS | CREATE OR REPLACE MODEL}
model_name
[OPTIONS(model_option_list)]
[AS query_statement]

其中:

{CREATE MODEL | CREATE MODEL IF NOT EXISTS | CREATE OR REPLACE MODEL} 是以下某个语句:

  • CREATE MODEL - 创建和训练指定数据集中的新模型。如果模型名称已存在,CREATE MODEL 将返回错误。除非您指定拆分选项,否则训练数据集将自动拆分为训练数据和评估数据。
  • CREATE MODEL IF NOT EXISTS - 仅当指定数据集中当前不存在模型时才创建和训练新模型。
  • CREATE OR REPLACE MODEL - 在指定数据集中创建和训练模型,以及替换同名的现有模型。

CREATE MODEL 语句必须符合以下规则:

  • 只允许使用一个 CREATE 语句。
  • 对于线性回归模型,label 列必须是实值(列值不能为 +/- 无穷大或 NaN)。
  • 对于逻辑回归模型,标签列必须仅包含两个不同的值。
  • model_option_list 中,必须使用 model_type 选项。所有其他选项都是可选的。

model_name

model_name 是您要创建或替换的模型的名称。每个数据集的模型名称必须是唯一的。模型名称必须遵循与 BigQuery 表相同的命名规则。模型名称的要求如下:

  • 最多可以包含 1024 个字符
  • 包含字母(大写或小写)、数字和下划线

model_name 不区分大小写。

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

model_option_list

借助 model_option_list,您可以指定其他模型选项。您可以使用逗号分隔列表添加多个选项。

采用以下格式指定模型选项列表:

NAME=VALUE, ...

NAMEVALUE 必须是以下某种组合:

NAME VALUE 详情
model_type

linear_reg

logistic_reg

linear_reg 用于创建线性回归模型。

logistic_reg 用于创建逻辑回归模型。

必须使用 model_type 选项。所有其他选项都是可选的。

input_label_cols STRING

训练数据中的标签列名称。input_label_cols 接受一组字符串,但 linear_reglogistic_reg 模型仅支持一个数组元素。

如果未指定 labels,系统会使用训练数据中名为“标签”的列。如果两者都不存在,则查询会失败。

对于线性回归模型,标签列必须为实值(列值必须是实数)。对于逻辑回归模型,标签列必须仅包含两个不同的值。

l1_reg FLOAT64

应用 L1 正则化的量。默认值为 0。

l2_reg FLOAT64

应用 L2 正则化的量。默认值为 0。

max_iterations INT64

训练迭代次数上限(步数)。默认值为 20。

learn_rate_strategy line_search
constant

选择用于指定训练过程中的学习速率的策略。默认值为 line_search

线搜索会减慢训练速度并增加处理的字节数,但即使指定了较大的初始学习速率,其通常也会收敛。

如果模型 learn_rate 似乎将每次迭代加倍(如 ml.training_info 所示),请尝试将 ls_init_learn_rate 设置为最近一次加倍的学习速率。每种模型的最佳初始学习速率各不相同。适合某种模型的良好初始学习速率对于另一模型而言可能并非是良好的初始学习速率。

learn_rate FLOAT64

learn_rate_strategy 设置为 constant 时,梯度下降法的学习速率。如果 learn_rate_strategy 设置为 line_search,则系统会返回错误。默认值为 0.1。

early_stop BOOL

指示训练应在相对损失改进幅度小于 min_rel_progress 的第一次迭代后停止。默认值为 true。

min_rel_progress FLOAT64

early_stop 设置为 true 时,继续训练所需的最低相对损失改进幅度。例如,如果该值为 0.01,则表示每次迭代必须将损失减少 1% 才能继续训练。默认值为 0.01。

data_split_method

auto_split

random

custom

seq

no_split

将输入数据拆分为训练集和评估集的方法。训练数据用于训练模型。可通过早停法使用评估数据来避免过拟合。默认值为 auto_split

random 随机分割数据。随机拆分是非确定性的 - 不同的训练运行过程会产生不同的拆分结果。

custom 利用客户提供的 BOOL(布尔值)列拆分数据。布尔值为“true”的行用作评估数据。布尔值为“false”的行用作训练数据。

seq 利用客户提供的列按顺序拆分数据。该列可以是任何可排序的数据类型:NUMERIC、STRING 或 TIMESTAMP。拆分数值小于阈值的所有行都会用作训练数据。其余的行(包括 NULL)用作评估数据。

no_split 将所有数据都用作训练数据。

如果 data_split_method 未指定或明确设置为 auto_split,则自动拆分策略如下:

  1. 当输入数据中的行数不足 500 时,所有行都用作训练数据。
  2. 当输入数据中的行数介于 500 到 50000 时,20% 的数据会用作 random 拆分中的评估数据。
  3. 当输入数据中的行数超过 50000 时,其中只有 10000 行会用作 random 拆分中的评估数据。
data_split_eval_fraction FLOAT64

此选项用于 randomseq 拆分。data_split_eval_fraction 是用于评估的数据的一部分,精确到两位小数。默认值为 0.2。

data_split_col STRING

此选项可标识用于拆分数据的列。此列不能用作功能或标签,并且会自动中功能中排除。

data_split_methodcustom 时,相应列的类型应该为 BOOL。值为 true 或 NULL 的行用作评估数据。值为 false 的行用作训练数据。

data_split_methodseq 时,相应列中的上一 data_split_fraction 行(从最小到最大)用作评估数据。前几行用作训练数据。

ls_init_learn_rate DOUBLE

设置 learn_rate_strategy='line_search' 使用的初始学习速率。只有指定了 line_search 时才能使用此选项。

warm_start BOOL

此选项用于重新训练采用新训练数据和/或新模型选项的模型。除非明确替换,否则用于训练模型的初始选项将用于热启动运行。默认值为 false。

在热启动运行中,迭代次数重置为从零开始。training_run 次数或 TIMESTAMP 列可用于区分热启动运行和原始运行。

model_typelabels 选项以及训练数据架构不能在热启动时更改。

query_statement

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

query_statement 引用的所有列都用作模型的输入,input_label_colsdata_split_col 中所含的列除外。

CREATE MODEL 示例

CREATE MODEL 语句会使用指定选项创建模型。如果数据集中已存在模型名称,则系统会返回以下错误:

Already Exists: [PROJECT_ID]:[DATASET].[MODEL]

要替换现有模型,请使用 CREATE OR REPLACE MODEL 语句。

以下示例将在您默认项目的 mydataset 中创建名为 mymodel 的模型。

训练线性回归模型

以下示例将创建并训练线性回归模型。学习速率设置为.15,L1 正则化设置为 1,训练迭代次数上限设置为 5。

CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  ( model_type='linear_reg',
    ls_init_learn_rate=.15,
    l1_reg=1,
    max_iterations=5 ) AS
SELECT
  column1,
  column2,
  column3,
  label
FROM
  `mydataset.mytable`
WHERE
  column4 < 10

训练可依序进行数据拆分的线性回归模型

在此示例中,您要创建一个可依序进行数据拆分的线性回归模型。拆分比例为 .3,拆分利用 timestamp 列作为拆分的基础。

CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  ( model_type='linear_reg',
    ls_init_learn_rate=.15,
    l1_reg=1,
    max_iterations=5,
    data_split_method='seq',
    data_split_eval_fraction=0.3,
    data_split_col='timestamp' ) AS
SELECT
  column1,
  column2,
  column3,
  timestamp,
  label
FROM
  `mydataset.mytable`
WHERE
  column4 < 10

训练进行自定义数据拆分的线性回归模型

在此示例中,您要将数据手动拆分为训练表和评估表。训练表名为 training_table。评估表名为 evaluation_table

此命令采用自定义拆分方法创建线性回归模型,并通过连接评估和培训表中的数据来训练模型。

CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  ( model_type='linear_reg',
    data_split_method='custom',
    data_split_col='split_col' ) AS
SELECT
  *,
  false AS split_col
FROM
  `mydataset.training_table`
UNION ALL
SELECT
  *,
  true AS split_col
FROM
  `mydataset.evaluation_table`

在此示例中,训练表和评估表中的所有列均为功能或标签。该查询使用 SELECT *UNION ALLsplit_col 列中的所有数据附加到现有数据。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面