入门TensorFlow的第二道拦路虎就是特征工程,也就是各种示例代码中经常出现的tf.feature_column.xxx
。为了理解特征工程,我查阅了一些资料和代码,下面是我的总结。
什么是特征工程
在去训练一个模型的时候,总会用到原始数据。原始数据是每列有着含义的N行数据。所谓特征工程就是把原始数据的列转换成特征的过程。
什么是特征
在机器学习和模式识别中,特征是在观测现象中的一种独立、可测量的属性。选择信息量大的、有差别性的、独立的特征是模式识别、分类和回归问题的关键一步 。
原始数据的列为什么不是特征
特征是从原始数据的列转换而来。从关系上来说,可能是一对一,也可能是多对一(比如经度和维度两列合成一个特征),原始数据还可能存在冗余列,比如年龄和出生年月;从数据类型上来说,原始数据可以是任意类型,但特征一定是数字或者布尔;从数值上来说,原始数据随心所欲,特征可能就要格式化或者归一化;从代码层面上来说,特征应该是tensorflow框架指定的数据类型feature_column
。所以原始数据的列和特征有着区别。
怎么做特征工程
特征构建
使用numeric_column构建数值特征
numeric_column
的入参如下:
numeric_column( |
下面是一些例子:
numeric_feature_column = tf.feature_column.numeric_column(key="SepalLength") |
使用bucketized_column构建分区特征
bucketized_column
的入参如下:
bucketized_column( |
下面是一个例子:
# A numeric column for the raw input. |
- 在创建存储分区化列之前,我们先创建了一个数值列来表示原始年份。
- 我们将数值列作为第一个参数传递到
tf.feature_column.bucketized_column()
中。 - 指定一个 三元素
boundaries
矢量可以创建一个 四元素存储分区化矢量
使用categorical_column_with_vocabulary_list构建分类词特征
categorical_column_with_vocabulary_list
的入参如下:
categorical_column_with_vocabulary_list( |
- key: feature名字
- vocabulary_list: 对于category来说,进行转换的list.也就是category列表.
- dtype: 仅仅string和int被支持,其他的类型是无法进行这个操作的.
- default_value: 当不在vocabulary_list中的默认值,这时候num_oov_buckets必须是0.
- num_oov_buckets: 用来处理那些不在vocabulary_list中的值,如果是0,那么使用default_value进行填充;如果大于0,则会在[len(vocabulary_list), len(vocabulary_list)+num_oov_buckets]这个区间上重新计算当前特征的值.
下面是一个例子:
# Given input "feature_name_from_input_fn" which is a string, |
vocabulary_list
在词汇列表较长的时候,需要手工输入很多。所以这个方法有个改进的方法,从文件中读取词汇列表。如下:
# Given input "feature_name_from_input_fn" which is a string, |
使用categorical_column_with_hash_bucket构建哈希分区特征
categorical_column_with_hash_bucket
的入参如下:
categorical_column_with_hash_bucket( |
下面是一个例子:
# Create categorical output for input "feature_name_from_input_fn". |
哈希分区构建特征的思路与前面不一样,前面都是先有分法,再去构建特征,而哈希分区是我有数据之后,我愿意给他分多少类,我就设置hash_buckets_size
是多少。size值越大也容易精确的分桶,但开销也越大。
使用categorical_column_with_identity构建ID分类特征
categorical_column_with_identity
的入参如下:
categorical_column_with_identity( |
这种构建方法与哈希分区并无实质上的不同。下面是一个例子:
# Create a categorical output for input "feature_name_from_input_fn", |
使用weighted_categorical_column构建带权重的分类特征
weighted_categorical_column
的入参如下:
weighted_categorical_column( |
下面是一段示例代码:
color_data = {'color': [['R'], ['G'], ['B'], ['A']], |
使用crossed_column构建组合特征
crossed_column
入参如下:
tf.feature_column.crossed_column( |
使用两个特征组合起来去形成一个新的特征。下面是示例代码:
def test_crossed_column(): |