【Tensorflow】TensorFlow2中提供的几种处理特征列的方法


TensorFlow 2 提供了多种处理特征列的方法,用于对数据进行转换,然后把转换后的数据传入TensorFlow的layers.DenseFeatures层,并将该层作为神经网络的输入层。

1. 处理数值列

一个特征列的输出将成为模型的输入。 数值列(numeric column) 是最简单的列类型。它用于表示实数特征。使用此列时,模型将从 dataframe 中接收未更改的列值。
用法示例:

photo_count = feature_column.numeric_column('PhotoAmt')
demo(photo_count)

2. 对数值列进行分桶(或分段)

通常,如果不希望将数字直接输入模型,而是根据数值范围将其值分成不同的类别。例如,考虑代表一个人年龄的原始数据。我们可以用 分桶列bucketized column)将年龄分成几个分桶(buckets),而不是将年龄表示成数值列。请注意下面的 one-hot 数值表示每行匹配的年龄范围。
用法示例:

age = feature_column.numeric_column('Age')
age_buckets = feature_column.bucketized_column(age, boundaries=[1, 3, 5])
demo(age_buckets)

3. 处理分类列

在数据集中,如果分类列用字符串表示(例如 ‘fixed’,‘normal’,或 ‘reversible’)。我们无法直接将字符串提供给模型。相反,我们必须首先将它们映射到数值。分类词汇列(categorical vocabulary columns)提供了一种用 one-hot 向量表示字符串的方法。词汇表可以用 categorical_column_with_vocabulary_list 作为 list 传递,或者用 categorical_column_with_vocabulary_file 从文件中加载。
用法示例:

# 把分类字段转换为分类列(categorical_column)
animal_type = feature_column.categorical_column_with_vocabulary_list('Type', ['Cat', 'Dog'])
# 把分类列(categorical_column)转换为独热编码
animal_type_one_hot = feature_column.indicator_column(animal_type)
demo(animal_type_one_hot)

4. 使用Embedding处理分类列

假设我们不是只有几个可能的字符串,而是每个类别有数千(或更多)值。 由于多种原因,随着类别数量的增加,使用 one-hot 编码训练神经网络变得不可行。我们可以使用嵌入列来克服此限制。嵌入列(embedding column)将数据表示为一个低维度密集向量,而非多维的 one-hot 向量,该低维度密集向量可以包含任何数,而不仅仅是 0 或 1。嵌入的大小(在下面的示例中为 8)是必须调整的参数。

关键点:当分类列具有许多可能的值时,最好使用嵌入列
用法示例:

# Notice the input to the embedding column is the categorical column we previously created
breed1 = feature_column.categorical_column_with_vocabulary_list('Breed1', dataframe.Breed1.unique())
breed1_embedding = feature_column.embedding_column(breed1, dimension=8)
demo(breed1_embedding)

5. 经过哈希处理的特征列

表示具有大量数值的分类列的另一种方法是使用 categorical_column_with_hash_bucket。该特征列计算输入的一个哈希值,然后选择一个 hash_bucket_size 分桶来编码字符串。使用此列时,您不需要提供词汇表,并且可以选择使 hash_buckets 的数量远远小于实际类别的数量以节省空间。

关键点:该技术的一个重要缺点是可能存在冲突,不同的字符串被映射到同一个范围。实际上,无论如何,经过哈希处理的特征列对某些数据集都有效。
用法示例:

breed1_hashed = feature_column.categorical_column_with_hash_bucket('Breed1', hash_bucket_size=10)
demo(feature_column.indicator_column(breed1_hashed))

6. 使用组合的特征列

将多种特征组合到一个特征中,称为特征组合(feature crosses),它让模型能够为每种特征组合学习单独的权重。这里,我们将创建一个 age 和 thal 组合的新特征。请注意,crossed_column 不会构建所有可能组合的完整列表(可能非常大)。相反,它由 hashed_column 支持,因此可以选择表的大小。
用法示例

crossed_feature = feature_column.crossed_column([age_buckets, animal_type], hash_bucket_size=10)
demo(feature_column.indicator_column(crossed_feature))

经过前面这些方法预处理之后,可以把它们拼接起来一起作为神经网络的输入层。

扫描二维码关注公众号,回复: 16687380 查看本文章

猜你喜欢

转载自blog.csdn.net/ARPOSPF/article/details/132791329
今日推荐