这里介绍tensorflow中几种常见的特征处理方式,也是tensorflow中封装好的库函数。
主要来源于tf.feature_column.*
tf.feature_column.categorical_column_with_hash_bucket(
key,
hash_bucket_size,
dtype=tf.dtypes.string
)
输入特征为稀疏特征,一般为字符串数据或者整型数据,将输入稀疏特征转换为有限个桶,计算公式为
output_id = Hash(input_feature_string) % bucket_size
要求input_feature_string
为字符型,如果输入的稀疏特征是整型的,需要先转换为字符型才能使用上面的映射公式。
对于字典型的features
,如果features[key]
要么是Tensor
,要么是 SparseTensor
,但是如果是Tensor
的话,缺失值可以被表示为为-1的整型以及‘ ’的字符型,这种情况下,相应的特征值将会被舍弃掉。
tf.feature_column.categorical_column_with_identity(
key,
num_buckets,
default_value=None
)
输入特征为介于[0, num_buckets)之间的整型,通常是用于连续范围内的整型索引,但是也不一定是必须的,如果这个范围内的很多ID是用不到的,那么可以使用categorical_column_with_hash_bucket
。
对于字典型的features
,如果features[key]
要么是Tensor
,要么是 SparseTensor
,但是如果是Tensor
的话,缺失值可以被表示为为-1的整型以及‘ ’的字符型,这种情况下,相应的特征值将会被舍弃掉。
tf.feature_column.bucketized_column(
source_column,
boundaries
)
每个桶取值的区间是左闭右开,boundaries
表示区间分割点,例如boundaries=[0, 1, 2]
表示会生成4哥桶,分别是(-inf, 0),[0, 1),[1, 2),[2, inf)。
举个例子:
boundaries = [0, 10, 100]
input tensor = [[-5, 10000]
[150, 10]
[5, 100]]
输出为:
output = [[0, 3]
[3, 2]
[1, 3]]
tf.feature_column.embedding_column(
categorical_column,
dimension,
combiner='mean',
initializer=None,
ckpt_to_load_from=None,
tensor_name_in_ckpt=None,
max_norm=None,
trainable=True
)
当你的输入是离散型数据,而你想要连续型的输出(例如输出的连续型数据喂给DNN)。
输入变量必须是由categorical_column_*
函数所输出的CategoricalColumn
类型数据。
上面各个参数的含义如下:
- categorical_column:是由
categorical_column_*
函数所输出的CategoricalColumn
类型数据,即是离散IDs,而这些IDs是用来从embedding lookup(embedding查找表)中查找时的输入。- dimension:大于0的整型数值,用来指定embedding的维度。
- combiner:有一个字符串取值,表示对于单行样本如果有多个取值的情况下,如何对其进行降维,目前支持
mean
,sqrtn
,sum
这三种操作,默认情况下为mean
,而sqrtn
经常能够取得较好的效果,特别是在词袋模型形式的列特征时。这三种操作可以看作是对于每一列特征在样本级别的规范化- initializer:对于embedding变量的初始化,默认初始化方式为
tf.compat.v1.truncated_normal_initializer
表示以0为均值、 1/sqrt(dimension)为标准差的截断正态分布。
输出值为 离散IDs特征映射成的连续值特征
tf.feature_column.crossed_column(
keys,
hash_bucket_size,
hash_key=None
)
交叉后的特征会基于hash_bucket_size
的大小进行hash得到结果,理论上,转换操作的公式如下:
Hash(cartesian product of features) % hash_bucket_size