FeatureSpace
classkeras.utils.FeatureSpace(
features,
output_mode="concat",
crosses=None,
crossing_dim=32,
hashing_dim=32,
num_discretization_bins=32,
name=None,
)
一站式实用工具,用于预处理和编码结构化数据.
参数:
feature_names: 将特征名称映射到其类型规范的字典,例如 {"my_feature": "integer_categorical"}
或 {"my_feature": FeatureSpace.integer_categorical()}
.
有关所有支持类型的完整列表,请参见下面的"可用特征类型”段落.
output_mode: 可以是 "concat"
或 "dict"
之一.在 concat 模式下,所有特征会被连接成一个向量.
在 dict 模式下,FeatureSpace 返回一个单独编码特征的字典(与输入字典键相同).
crosses: 要交叉在一起的特征列表,例如 crosses=[("feature_1", "feature_2")]
.特征将通过
将其组合值哈希成固定长度的向量来进行"交叉”.
crossing_dim: 哈希交叉特征的默认向量大小.默认为 32
.
hashing_dim: 类型为 "integer_hashed"
和 "string_hashed"
的特征的默认向量大小.默认为 32
.
num_discretization_bins: 类型为 "float_discretized"
的特征的默认分箱数.默认为 32
.
可用特征类型:
注意,所有特征都可以通过它们的字符串名称来引用,例如 "integer_categorical"
.使用字符串名称时,使用默认参数值.
# 普通浮点值.
FeatureSpace.float(name=None)
# 通过特征标准化预处理的浮点值
# (即通过 [`keras.layers.Normalization`](/api/layers/preprocessing_layers/numerical/normalization#normalization-class) 层).
FeatureSpace.float_normalized(name=None)
# 通过线性缩放预处理的浮点值
# (即通过 [`keras.layers.Rescaling`](/api/layers/preprocessing_layers/image_preprocessing/rescaling#rescaling-class) 层).
FeatureSpace.float_rescaled(scale=1., offset=0., name=None)
# 要离散化的浮点值.默认情况下,离散表示将被独热编码.
FeatureSpace.float_discretized(
num_bins, bin_boundaries=None, output_mode="one_hot", name=None)
# 要索引的整数值.默认情况下,离散表示将被独热编码.
FeatureSpace.integer_categorical(
max_tokens=None, num_oov_indices=1, output_mode="one_hot", name=None)
# 要索引的字符串值.默认情况下,离散表示将被独热编码.
FeatureSpace.string_categorical(
max_tokens=None, num_oov_indices=1, output_mode="one_hot", name=None)
# 要哈希成固定数量箱的整数值.默认情况下,离散表示将被独热编码.
FeatureSpace.integer_hashed(num_bins, output_mode="one_hot", name=None)
# 要哈希成固定数量箱的字符串值.默认情况下,离散表示将被独热编码.
FeatureSpace.string_hashed(num_bins, output_mode="one_hot", name=None)
示例:
使用字典输入数据的基本用法:
raw_data = {
"float_values": [0.0, 0.1, 0.2, 0.3],
"string_values": ["zero", "one", "two", "three"],
"int_values": [0, 1, 2, 3],
}
dataset = tf.data.Dataset.from_tensor_slices(raw_data)
feature_space = FeatureSpace(
features={
"float_values": "float_normalized",
"string_values": "string_categorical",
"int_values": "integer_categorical",
},
crosses=[("string_values", "int_values")],
output_mode="concat",
)
# 在开始使用 FeatureSpace 之前,
# 必须对其进行 `adapt()` 处理.
feature_space.adapt(dataset)
# 可以在字典数据上调用 FeatureSpace(批量或非批量).
output_vector = feature_space(raw_data)
使用 tf.data
的基本用法:
# 无标签数据
preprocessed_ds = unlabeled_dataset.map(feature_space)
# 有标签数据
preprocessed_ds = labeled_dataset.map(lambda x, y: (feature_space(x), y))
使用 Keras 函数式 API 的基本用法:
# 获取字典 Keras 输入对象
inputs = feature_space.get_inputs()
# 获取相应的编码 Keras 张量
encoded_features = feature_space.get_encoded_features()
# 构建函数式模型
outputs = keras.layers.Dense(1, activation="sigmoid")(encoded_features)
model = keras.Model(inputs, outputs)
自定义每个特征或特征交叉:
feature_space = FeatureSpace(
features={
"float_values": FeatureSpace.float_normalized(),
"string_values": FeatureSpace.string_categorical(max_tokens=10),
"int_values": FeatureSpace.integer_categorical(max_tokens=10),
},
crosses=[
FeatureSpace.cross(("string_values", "int_values"), crossing_dim=32)
],
output_mode="concat",
)
返回整数编码特征的字典:
feature_space = FeatureSpace(
features={
"string_values": FeatureSpace.string_categorical(output_mode="int"),
"int_values": FeatureSpace.integer_categorical(output_mode="int"),
},
crosses=[
FeatureSpace.cross(
feature_names=("string_values", "int_values"),
crossing_dim=32,
output_mode="int",
)
],
output_mode="dict",
)
指定自己的 Keras 预处理层:
# 假设其中一个特征是一个短文本段落,
# 我们希望通过 TF-IDF 将其编码为向量(每个段落一个向量).
data = {
"text": ["1st string", "2nd string", "3rd string"],
}
# 有一个 Keras 层可以做到这一点:TextVectorization.
custom_layer = layers.TextVectorization(output_mode="tf_idf")
# 我们可以使用 FeatureSpace.feature 创建一个自定义特征
# 这将使用我们的预处理层.
feature_space = FeatureSpace(
features={
"text": FeatureSpace.feature(
preprocessor=custom_layer, dtype="string", output_mode="float"
),
},
output_mode="concat",
)
feature_space.adapt(tf.data.Dataset.from_tensor_slices(data))
output_vector = feature_space(data)
检索底层 Keras 预处理层:
# 每个特征的预处理层在 `.preprocessors` 中可用.
preprocessing_layer = feature_space.preprocessors["feature1"]
# 每个特征交叉的交叉层在 `.crossers` 中可用.
# 它是 keras.layers.HashedCrossing 的一个实例.
crossing_layer = feature_space.crossers["feature1_X_feature2"]
保存和重新加载 FeatureSpace:
feature_space.save("featurespace.keras")
reloaded_feature_space = keras.models.load_model("featurespace.keras")