自动特征预处理
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} 格式。 |
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 | +------------------------+----------------------+
增强树模型支持目标编码。