本文总结几种出现在tensorflow 的 feature_column api 的处理函数
1. feature_column 主要是连接数据和tf.estimator 之间的桥梁,将原始数据中的一些离散型、类别型特征转化成tensorflow 可使用的类型。并且神经网络只能处理数值型数据,而且在某些就算是数值类型的特征也需要做归一化,离散化等操作,这些都需要依赖feature_column 来做转化。
一般流程是:定义input_fn 来过滤、填补数据,然后输出到tf.feature_column 得到 feature_columns , 再将转化好的数据输入到tf.estimator , 在tf.estimator 中包含了DNNClassifier , DNNLinearCombineClassifier, LinearClassifier, 在Wide&Deep官方实现中就是使用这几种函数。
2. 那么现在需要构建特征列,具体介绍feature_column中主要使用的几个函数。
类别类型:
主要使用的是categorical_column_with_hast_bucket 以及categorical_column_with_identity
数值类型:
主要使用的是numeric_column, embedding_column, indicator_column, bucketized_column
在输入到网络的数值类型特征其实可以直接concat 到最终的向量中,一般不需要做这些类型转换
其中indicator 和 embedding columns不能直接作用在原始特征上,需要作用到categorical columns 上,将categorical column 得到的稀疏tensor 转换成one-hot 或者multi-hot 的稠密tensor
在类别类别中常使用的是categorical_column_with_hast_bucket, 尤其是词表不确定有多少的时候,或者词表特别大时浪费存储。我们可以指定hash_bucket_size 就可以避免,同时设置这个size 稍微大于总类别(其实就算小于总类别数,中间有哈希碰撞也不会太影响模型效果,实测)
组合类型:
多个特征组合成一个特征crossed column, 举个例子就是坐标信息(x,y )wide and deep 的官方实现中有使用到这个特征类型
另外,在同一个网络模型中,可能多个特征共享相同的embedding 映射空间,例如用户偏好歌曲id和行为序列中歌曲id,这时就可以用到tf.feature_column.shared_embedding_columns.(参数类似embedding column, 其返回值是和categrial column 相同维度)
还有一类特征,我们可以设定不同特征有不同的权重,例如我更关注用户的偏好而不关心用户地点信息,或者在行为序列中离的近的权重更大而离的远的权重小,那么我们可以使用weighted_categorical_column