1. 背景
tf.estimator是tensorflow的一个高级API接口,它最大的特点在于兼容分布式和单机两种场景,工程师可以在同一套代码结构下即实现单机训练也可以实现分布式训练,正是因为这样的特点,目前包括阿里在内的很多公司都在使用这一接口来构建自己的深度学习模型。
特征预处理是几乎所有机器学习模型所必须的一个过程,常见的特征预处理方法包括:连续变量分箱化、离散变量one-hot、离散指标embedding等,tensorflow给我们提供了一个功能强大的特征处理函数tf.feature_column,它通过对特征处理将数据输入网络并交由estimator来进行训练,本文通过实际的数据输出来直观地介绍与展现tf.feature_column的基本用法。
2. 数据处理
特征数据主要包括categorical和dense两类,处理方法是使用tensorflow中的feature_column接口来进行定义,如下图,总共有九种不同的函数,分别有五种Categorical function、三种numerical function 加上一种bucketized_column可属于任何一种,categorical column中的 with_identity其实和 dense column中的indicator_column没有区别,都是类别特征的one-hot表示,但是其属于不同的特征类别,前者属于categorical后者属于dense,对于estimator编写的不同网络而言,其可接受的one-hot类型不同,这里在实际操作中需要注意转换。
2.1 categorical column
2.1.1 categorical_column_with_identity
- categorical_column_with_identity:把numerical data转乘one hot encoding
- 只适用于值为整数的类别型变量,实际输出如下:
import
- 如图输出为birthplace的one-hot结果,num_buckets用于确定每一个one-hot向量的最大特征类别数
2.1.2 categorical_column_with_vocabulary_list or categorical_column_with_vocabulary_file
- categorical_column_with_vocabulary_list or categorical_column_with_vocabulary_file:根据单词的序列顺序,把单词根据index转换成one hot encoding
- 主要用于处理非整数型的类别特征,两个函数的区别在于处理变量类别的多少,数量前者对应类别少的情况,所有可能的类别可以直接输入,后者对应类别多的情况,所有可能的类别可以存在一个文件中输入,实际输出如下:
import
- 如图输出为sex的one-hot结果,其后跟着的list用于定义该变量的所有类别。
2.1.3 categorical_column_with_hash_bucket
- categorical_column_with_hash_bucket:对于处理包含大量文字或数字类别的特征时可使用hash的方式,这能快速地建立对应的对照表,缺点则是会有哈希冲突的问题。
- hash_bucket_size的大小一般设置为总类别数的2-5倍,该函数适用于不能确定所有类别样式的类别变量,实际输出如下:
import
- 如上,输出为department的one-hot结果,对于不同类的department出现了哈希冲突的情况。
2.1.4 crossed_column
- crossed_column:特征交叉,在有些情况下,特征独自编码与多维特征交叉后的特征特性会有不一样的结果。
- 该函数不能对hash映射之后的特征进行交叉,实际输出如下:
import
- 如上,输出为cross的one-hot结果,hash_bucket_size代表输出的交叉向量的one-hot维度。
2.1.5 embedding_column
- embedding_column:把categorical的data,借由lookup table的方式找寻对应的feature vector来表示。假设有81个单词,若使用categorical_column_vocbulary_list,然后转乘numerical的indicator_column,则需要81维度来描述此些单词,这样极易造成数据的稀疏化,对于推荐系统而言,大维度的稀疏数据对于结果的影响较大,因此我们考虑使用embedding_column,来对数据进行压缩,实际输出如下:
import
- 如上,输出为交叉特征的embading向量,embedding_column的输入为处理之后的特征变量,可以是categorical也可以是dense的。
2.2 Dense column
2.2.1 numeric_column
- numeric_column:该函数主要用于处理连续型变量,即可以是float类型也可以是int类似,从table中读取对应的(key)column,并把它转成dtype的格式,实际情况如下:
import
2.2.2 bucketized_column
- bucketized_column: 该函数将连续变量进行分桶离散化,输出one-hot的结果,方便连续值指标与分类变量进行交叉特征构建,
- 实际情况如下:
import
3. 总结
本文通过直观的数据输出来展现tf.feature_column的特征处理过程,方便大家理解这个函数,tensorflow作为目前最常用的深度学习框架,有着很多高级的API,这些接口都可以极大方便我们算法工程师的工作,tf.estimator不仅可以很好地处理特征,同时它将train、evaluatete、predict都集成到了一起,大家平时可以多使用该接口。