输入特征 (↑)
input_features
部分是特征定义的列表。每个特征定义包含两个必填字段:name
和 type
。
input_features:
-
name: Pclass
type: category
{
"input_features": [{"name": "Pclass", "type": "category"}]
}
name
是数据集中特征的名称。type
是 支持的数据类型 之一。
预处理¶
回顾 Ludwig 的蝴蝶框架。
每个输入特征可以通过 preprocessing
子部分指定其自己的预处理。
input_features:
-
name: Fare
type: number
preprocessing:
missing_value_strategy: fill_with_mean
{
"input_features": [
{
"name": "Fare",
"type": "number",
"preprocessing": {
"missing_value_strategy": "fill_with_mean"
}
}
]
}
也可以为特定类型的所有特征指定预处理规则。参见 类型全局预处理。
常用参数¶
缺失值处理策略¶
Ludwig 允许数据集中的任何输入特征“缺失”(在训练和预测时)。缺失值如何处理的默认行为取决于特征类型,但这种处理策略可以在每个特征配置的 preprocessing
部分进行配置
preprocessing:
missing_value_strategy: fill_with_mean
选项
fill_with_const
:使用fill_value
参数指定的特定值替换缺失值。fill_with_mode
:使用列中最常出现的值替换缺失值。fill_with_mean
:使用列中值的平均值替换缺失值(仅限number
特征)。fill_with_false
:使用列中的false
值替换缺失值(仅限binary
特征)。bfill
:使用输入数据集中后续行的下一个有效值替换缺失值。ffill
:使用输入数据集中前面行的上一个有效值替换缺失值。drop_row
:如果此列缺失,则从数据集中移除整行。
对于输出特征,默认策略始终是 drop_row
,因为否则 Ludwig 将被迫“编造”被预测的真实值。但是,如果需要,也可以使用相同的 missing_value_stragegy
参数覆盖此设置。
编码器¶
每个输入特征可以配置特定的 encoder
将输入特征值映射到张量。例如,用户可能希望使用 transformer
对 sequence
特征进行编码,或使用 stacked_cnn
对 image
特征进行编码。不同的数据类型支持不同的编码器。请查阅特定特征类型的文档,了解该类型支持哪些编码器。
除了 name
、type
和 preprocessing
之外的所有其他参数都将作为参数传递给编码器子部分。请注意,每个编码器可以有不同的参数,因此可以在每种数据类型的文档中找到关于特定数据类型可以使用的每个编码器的详细文档。以下是如何为一个输入特征指定特定编码器配置的示例
input_features:
-
name: text
type: text
preprocessing:
tokenizer: space
encoder:
type: bert
reduce_output: null
trainable: true
{
"input_features": [
{
"name": "text",
"type": "text",
"level": "word",
"preprocessing": {
"word_tokenizer": "space"
},
"encoder": {
"type": "bert",
"reduce_output": None,
"trainable": True,
}
}
]
}
编码器将原始特征值映射到张量。对于没有时间/序列维度的数据类型,通常是向量;对于具有时间/序列维度的数据类型,通常是矩阵;对于具有空间或时空维度的数据,通常是更高阶的张量。
同一个编码器的不同配置可能会返回不同阶数的张量,例如,序列编码器可能返回一个大小为 h
的向量,该向量是序列的最终向量或对序列长度进行池化后的结果;如果您将池化归约操作 (reduce_output
) 指定为 None
,它也可以返回一个大小为 l x h
的矩阵,其中 l
是序列长度,h
是隐藏维度。为了简单起见,大多数情况下您可以将输出想象成一个向量,但有一个 reduce_output
参数可以指定以更改默认行为。
对于初次使用的用户,我们建议从默认设置开始。
绑定编码器权重¶
Ludwig 提供的另一个特性是可以在不同编码器之间绑定权重。例如,如果我的模型将两个句子作为输入并返回它们蕴含的可能性,我可能希望使用同一个编码器对这两个句子进行编码。
这可以通过将一个特征的 tied
参数指定为另一个输出特征的名称来实现。例如
input_features:
-
name: sentence1
type: text
-
name: sentence2
type: text
tied: sentence1
{
"input_features": [
{
"name": "sentence1",
"type": "text"
},
{
"name": "sentence2",
"type": "text",
"tied": "sentence1"
}
]
}
指定一个不存在的输入特征名称将导致错误。此外,为了能够绑定权重,两个输入特征的所有编码器参数必须相同。
也可以为特定类型的所有特征指定编码器类型和相关的编码器参数。参见 类型全局编码器。