自动特征预处理
BigQuery ML 使用 CREATE MODEL
语句在训练期间执行自动预处理。自动预处理包括缺失值插补和特征转换。
如需了解 BigQuery ML 中的特征预处理支持,请参阅特征预处理概览。
缺失数据插补
在统计学上,插补使用替换值来取代缺失的数据。在 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} 格式。 |
STRUCT 的 ARRAY |
无转换 | |
NUMERIC 的 ARRAY |
无转换 |
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
的特征列,它具有类别 Apple
、Banana
和 Cranberry
,如下所示:
行 | 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 |
线性回归和逻辑回归以及增强树模型支持 One-Hot 编码。
虚拟编码
虚拟编码类似于独热编码,其中分类特征将转换为一组占位符变量。虚拟编码使用 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 | +------------------------+----------------------+
增强树模型支持目标编码。
后续步骤
如需详细了解支持自动特征预处理的模型支持的 SQL 语句和函数,请参阅以下文档: