tf.feature_column实用特征工程总结

如题所述

第1个回答  2022-06-18

tf.feature_column主要针对离散特征和连续特征, 概括而言, tf.feature_column可以实现四种场景

tf.feature_column对离散变量的处理有四个接口, 分别是 整数直接onehot , 指定词表onehot , hash降维onehot , embedding离散特征连续化 , 其中前三种都会把字符串/整数特征处理成onehot 0/1向量,最后一种embedding_column会对onehot的结果之上在做低维稠密向量映射, 接口如下

如果这一列离散特征本身就是用连续的整数表示的(从0开始),则可以直接映射为离散变量,提前指定最大取值数量,如果超出了用默认值填充,适合本来就是用整数ID编码,并且编码氛围不是很大的离散特征, 如果传入的值列表包含多个元素, 可以实现mutihot, 但是列表元素个数要相同

如果一列离散特征是字符串(也可以是整数), 并且取值范围不多, 可以使用这个接口, 定义好离散特征的取值就好, 当出现新值的时候可以分配新的索引位置,或者映射到已有的位置上, 词表映射也支持mutihot

如果设置num_oov_buckets=0, 或者不设置默认, 新词会直接忽略掉

另一种方式设置, 也可以处理新词问题, 直接映射到一个其他的词上面, 比如叫其他

测试mutihot, 同一个元素在一行出现多次, 计数会超过1

如果这一列是字符串离散变量(也可以是整数, 支持整数和字符串), 并且取值很多的情况下, 比如ID, 可以使用这个接口

如果输入是整数数值, 使用dtype设置dtype=tf.int32, 内部会把整数先转化为字符串在做hash

整数,词表,hash之后通过indicator_column直接离散化, 进一步可以使用embedding_column将onehot矩阵通过一个中间的embedding随机词表, lookup成一个embedding稠密向量, 默认情况下embedding可以跟着模型继续训练, 即trainable=True, 对于mutihot, embedding支持向量组合方式mean, sqrtn和sum
1.hash之后做embedding

2.词表onehot之后做embedding

3.整数直接onehot之后再embedding

mutihot的embedding

tf.feature_column对连续变量的处理有两个个接口, 分别是 连续值直接映射成连续变量 , 连续值分箱离散离散化 ,接口如下

连续变量分箱之后可以继续接embedding

tf.feature_column.crossed_column可以对离散特征进行交叉组合, 增加模型特征的表征能力

尝试用连续特征和离散特征进行交叉, 结果报错

定义多个特征时, 在features字典中定义多个key, tensor对象传入一个list, 其中list的特征顺序不影响特征组合结果, 以 feature_a.name的字符串顺序 决定组合的特征组合的顺序