自动特征预处理

BigQuery ML 使用 CREATE MODEL 语句在训练期间执行自动预处理。自动预处理包括缺失值插补特征转换

如需了解 BigQuery ML 中的特征预处理支持,请参阅特征预处理概览

如需了解每种模型类型支持的 SQL 语句和函数,请参阅每个模型的端到端用户体验历程

缺失数据插补

在统计学上,插补使用替换值来取代缺失的数据。在 BigQuery ML 中训练模型时,NULL 值被视为缺失的数据。在 BigQuery ML 中预测结果时,如果 BigQuery ML 遇到 NULL 值或之前未见过的值,则表示出现缺失值。BigQuery ML 会根据列中的数据类型,以不同方式处理缺失的数据。

列类型 插补方法
数字 在训练和预测中,数值列中的 NULL 值被替换为给定列的平均值(由原始输入数据中的特征列计算得出)。
独热/多热编码 在训练和预测中,编码列中的 NULL 值映射到数据中添加的额外类别。在预测期间,系统为之前未见过的数据分配的权重为 0。
TIMESTAMP TIMESTAMP 列混合使用标准化列和独热编码列的插补方法。对于生成的 Unix 时间列,BigQuery ML 将值替换为原始列中的 Unix 时间中值。对于其他生成的值,BigQuery ML 将值分配给每个已提取特征的相应 NULL 类别。
STRUCT 在训练和预测中,STRUCT 的每个字段均根据其类型进行插补。

特征转换

默认情况下,BigQuery ML 按照以下方式转换输入特征:

输入数据类型 转换方法 详情
INT64
NUMERIC
BIGNUMERIC
FLOAT64
标准化 对于大多数模型,BigQuery ML 会将数值列标准化并在零点居中放置,然后将其传入训练。例外情况包括提升树和随机森林模型(不进行标准化),以及 k-means 模型(STANDARDIZE_FEATURES 选项控制是否标准化数值特征)。
BOOL
STRING
BYTES
DATE
DATETIME
TIME
独热编码 对于除 TIMESTAMP 之外的所有非数值、非数组列,BigQuery ML 会对除提升树和随机森林模型以外的所有模型执行独热编码转换。此转换会为列中的每个唯一值生成单独的特征。 系统会应用标签编码转换来训练提升树和随机森林模型,以便将每个唯一值转换为数值。
ARRAY 多热编码 对于所有非数值的 ARRAY 列,BigQuery ML 会执行多热编码转换。此转换会为 ARRAY 中每个唯一元素生成单独的特征。
TIMESTAMP 时间戳转换 当线性或逻辑回归模型遇到 TIMESTAMP 列时,它会从 TIMESTAMP 中提取一组组件,并对提取的组件混合执行标准化和独热编码。对于以秒为单位的 Unix 时间组件,BigQuery ML 使用标准化。对于所有其他组件,则使用独热编码。

如需了解详情,请参阅下面的时间戳特征转换表
STRUCT 结构展开 当 BigQuery ML 遇到 STRUCT 列时,它会展开 STRUCT 内的字段以创建单列。它要求 STRUCT 的所有字段均有命名。不允许使用嵌套的 STRUCT。展开后的列名称采用 {struct_name}_{field_name} 格式。
STRUCTARRAY 无转换
NUMERICARRAY 无转换

TIMESTAMP 特征转换

下表显示了从 TIMESTAMP 列中提取的组件和相应的转换方法。

TIMESTAMP 组件 processed_input 结果 转换方法
Unix 时间(以秒为单位) [COLUMN_NAME] 标准化
一个月中的第几天 _TS_DOM_[COLUMN_NAME] 独热编码
一周中的第几天 _TS_DOW_[COLUMN_NAME] 独热编码
一年中的第几个月 _TS_MOY_[COLUMN_NAME] 独热编码
一天中的第几个小时 _TS_HOD_[COLUMN_NAME] 独热编码
一小时中的第几分钟 _TS_MOH_[COLUMN_NAME] 独热编码
一年中的第几周(每周从星期日开始) _TS_WOY_[COLUMN_NAME] 独热编码
年份 _TS_YEAR_[COLUMN_NAME] 独热编码

类别特征编码

对于独热编码的特征,您可以使用模型选项 CATEGORY_ENCODING_METHOD 指定其他的默认编码方法。对于广义线性模型 (GLM) 模型,您可以将 CATEGORY_ENCODING_METHOD 设置为以下值之一:

独热编码

独热编码将特征具有的每个类别映射到其自己的二元特征,其中 0 表示缺少特征,1 表示存在特征(称为“虚拟变量”)。此映射会创建 N 个新特征列,其中 N 是特征在训练表中的唯一类别数。

例如,假设您的训练表有一个名为 fruit 的特征列,它具有类别 AppleBananaCranberry,如下所示:

fruit
1 Apple
2 Banana
3 Cranberry

在此示例中,CATEGORY_ENCODING_METHOD='ONE_HOT_ENCODING' 选项会将表转换为以下内部表示法:

fruit_Apple fruit_Banana fruit_Cranberry
1 1 0 0
2 0 1 0
3 0 0 1

线性回归和逻辑回归以及提升树模型支持独热编码。

虚拟编码

虚拟编码类似于独热编码,其中分类特征将转换为一组占位符变量。虚拟编码使用 N-1 个占位符变量(而不是 N 个占位符变量)来表示特征的 N 个类别。例如,如果您将前面的独热编码示例中显示的同一 fruit 特征列的 CATEGORY_ENCODING_METHOD 设置为 'DUMMY_ENCODING',则表将转换为以下内部表示法:

fruit_Apple fruit_Banana
1 1 0
2 0 1
3 0 0

训练数据集中出现次数最多的类别会被舍弃。如果出现次数最多的有多个类别,则它们中的某个随机类别会被舍弃。

ML.WEIGHTS 中的最终权重组仍然包含舍弃的类别,但其权重始终为 0.0。对于 ML.ADVANCED_WEIGHTS,被舍弃变量的标准误差和 p 值为 NaN

如果对最初使用 'DUMMY_ENCODING' 进行训练的模型使用 warm_start,则系统会在第一次训练运行中舍弃相同的占位符变量。模型无法在训练运行之间更改编码方法。

线性回归和逻辑回归模型支持虚拟编码。

标签编码

标签编码会将分类特征的值转换为 [0, <number of categories>] 中的 INT64 值。

例如,如果您有一个如下所示的图书数据集:

标题 类型
书本 1 奇幻
书本 2 烹饪
书本 3 历史记录
书本 4 烹饪

标签编码值可能如下所示:

标题 类型(文本) 类型(数字)
书本 1 奇幻 1
书本 2 烹饪 2
书本 3 历史记录 3
书本 4 烹饪 2

编码词汇表按字母顺序排列。NULL 值和词汇表中不包含的类别均编码为 0

提升树模型支持标签编码。

目标编码

目标编码会将分类特征值替换为目标的概率(对于分类模型)或目标的预期值(对于回归模型)。

经过目标编码的特征可能类似于以下示例:

# Classification model
+------------------------+----------------------+
| original value         | target encoded value |
+------------------------+----------------------+
| (category_1, target_1) |     0.5              |
| (category_1, target_2) |     0.5              |
| (category_2, target_1) |     0.0              |
+------------------------+----------------------+

# Regression model
+------------------------+----------------------+
| original value         | target encoded value |
+------------------------+----------------------+
| (category_1, 2)        |     2.5              |
| (category_1, 3)        |     2.5              |
| (category_2, 1)        |     1.5              |
| (category_2, 2)        |     1.5              |
+------------------------+----------------------+

提升树模型支持目标编码。