第七节,tf.feature_column特征预处理

简介:

  特征列(feature columns)是原始数据和 Estimator 之间的媒介,特征列形式丰富多样 但需要转换为神经网络唯一可以处理的类型。

常见的特征预处理方法包括:连续变量分箱化、离散变量one-hot、离散指标embedding等。在feature_column接口实现的9种不同的接口函数中,

分别有5种Categorical function(分类函数-返回一个dense Column对象)、3种Numerical function(数值函数-返回一个 Categorical Column 对象) 和1种bucketized_column。

1、Categorical function

①numeric_column(key, shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None )

 # shape=(1,)表示一维数据

import tensorflow as tf
 
price = {'price': [[1.], [2.], [3.], [4.]]}  # 4行样本
 
column = tf.feature_column.numeric_column('price', normalizer_fn=lambda x:x*2 + 1)
tensor = tf.feature_column.input_layer(price,[column])
 
with tf.Session() as session:
    print(session.run([tensor]))  # 输出[array([[3.], [5.], [7.], [9.]], dtype=float32)]

 ②bucketized_column

 分箱列 把一个连续的数字范围分成几段。

import tensorflow as tf
 
years = {'years': [1999,2013,1987,2005]}  
 
years_fc = tf.feature_column.numeric_column('years')
column = tf.feature_column.bucketized_column(years_fc, [1990, 2000, 2010])    # 将年份分成4段
 
tensor = tf.feature_column.input_layer(years, [column])
 
with tf.Session() as session:
    print(session.run([tensor]))  # 输出如下

2、Numerical function

①categorical_column_with_vocabulary_list 很多数据都不是数字格式的,于是需要将它(比如一系列商品标签名)数字化

  

import tensorflow as tf

pets = {'pets': ['pig', 'dog', 'cat', 'mouse', 'hadoop']}   # 样本
column = tf.feature_column.categorical_column_with_vocabulary_list(
    key='pets',
    vocabulary_list=['cat', 'dog', 'rabbit', 'pig'],
    dtype=tf.string, default_value=-1,
    num_oov_buckets=0)

indicator = tf.feature_column.indicator_column(column)  
tensor = tf.feature_column.input_layer(pets, [indicator])

with tf.Session() as session:
    session.run(tf.global_variables_initializer())  
    session.run(tf.tables_initializer())
    print(session.run([tensor]))
 

  len(vocabulary_list)=4,所以箱子总数在 4 到 4+num_oov_buckets之间。当num_oov_buckets=3时,箱子总数可为4,也可为5 6 7。

②categorical_column_with_hash_bucket

 hash分箱策略:设分箱总数=50 而总类别数大于50,则按id%50分箱

import tensorflow as tf

colors = {'colors': ['green', 'red', 'blue', 'yellow', 'pink', 'blue', 'red', 'indigo']}

column = tf.feature_column.categorical_column_with_hash_bucket(
    key='colors', hash_bucket_size=5,
)
indicator = tf.feature_column.indicator_column(column)
tensor = tf.feature_column.input_layer(colors, [indicator])

with tf.Session() as session:
    session.run(tf.global_variables_initializer())
    session.run(tf.tables_initializer())
    print(session.run([tensor]))

 图中red和blue分类到一起了!

③crossed_column

 把两个特征分为一个特征。比如经度longitude和纬度latitude合并为一个位置location信息,经度化为100份,纬度化为50份,总共位置就有5000份。

 所以先调用以上的其中一种做一维划分,然后合并

import tensorflow as tf

featrues = {
    'longtitude': [20, 20, 20, 40, 40, 40, 72, 72, 27],
    'latitude': [20, 40, 72, 20, 40, 72, 20, 40, 72]
}

longtitude = tf.feature_column.numeric_column('longtitude')
latitude = tf.feature_column.numeric_column('latitude')

longtitude_b_c = tf.feature_column.bucketized_column(longtitude, [30, 60])
latitude_b_c = tf.feature_column.bucketized_column(latitude, [30, 60])

column = tf.feature_column.crossed_column([longtitude_b_c, latitude_b_c], 9)

indicator = tf.feature_column.indicator_column(column)
tensor = tf.feature_column.input_layer(featrues, [indicator])

with tf.Session() as session:
    session.run(tf.global_variables_initializer())
    session.run(tf.compat.v1.tables_initializer())
    print(session.run([tensor]))
 懵逼,什么鬼情况!

④embedding_column

 对于以上n个类别,一般输出n元01向量,其中一个1和n-1个0。  但当n较大时 输出就不好看了,可以采用embedding_column 把输出向量的元素数减少至

 

 

转载:

  https://blog.csdn.net/Andy_shenzl/article/details/105145865

  https://zhuanlan.zhihu.com/p/118381625

 

 2021-09-06 14:18:04

posted @ 2021-09-06 14:19  shines87  阅读(572)  评论(0编辑  收藏  举报