1.tf.feature_column.input_layer()
tf.feature_column.input_layer(
features,
feature_columns,
weight_collections=None,
trainable=True,
cols_to_vars=None,
cols_to_output_tensors=None
)
features:字典,最主要的是 dict的key一定要与 feature_columns的key一致,后续才能 根据key进行匹配
feature_columns:该参数必须是继承于DenseColumn的numeric_column, embedding_column, bucketized_column, indicator_column。如果feature是类别的,那么必须先 用embedding_column or indicator_column封装一下使用.注意此处fc要求的类型。
- tf.feature_column.indicator_column(categorical_column)
是一个onehot工具,用于把sparse特征进行onehot 变换,用于把categorical_column_with_*工具生成的特征变成onehot 编码
只有 categorical_column_with_* ,crossed_column 以及bucketized_column 类型的column 才可以使用该函数;indicator_column 可以将 任意的categorical_column_with_*作为参数。
但是,如果 buckets/unique(分箱,或者 ont-hot) 的值 比较大的时候,还是 建议使用 embedding_column.
3.tf.feature_column.numeric_column:默认情况下对连续特征标量化,也可以按照设置的shape,将其多维化变成矩阵。
tf.feature_column.numeric_column(
key,
shape=(1,),
default_value=None,
dtype=tf.float32,
normalizer_fn=None
)
key: 特征的名字。也就是对应的列名称。
shape: 该key所对应的特征的shape. 默认是1,但是比如one-hot类型的,shape就不是1,而是实际的维度。总之,这里是key所对应的维度,不一定是1.shape为[n,],n的取值应该与每个样本真实情况一致。
default_value: 如果不存在使用的默认值
normalizer_fn: 对该特征下的所有数据进行转换。可以自定义数值变换的函数normalizer_fn。
example:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
sess=tf.Session()
features = {
'price':[[2.0],[30.0],[5.0],[100.0]]
}
item1_price=tf.feature_column.numeric_column("price")
columns = [
item1_price
]
inputs = tf.feature_column.input_layer(features, columns)
init = tf.global_variables_initializer()
sess.run(tf.tables_initializer())
sess.run(init)
v=sess.run(inputs)
print(v)
output:
[[ 2.]
[ 30.]
[ 5.]
[100.]]
如果其中输入的维度变化了,shape应该设置成一致的:
features = {'price':[[2.0,30],[30.0,12],[2,5.0],[3,100.0]]}
item1_price=tf.feature_column.numeric_column("price",shape=[2,])
output:
[[ 2. 30.]
[ 30. 12.]
[ 2. 5.]
[ 3. 100.]]
4.tf.feature_column.bucketized_column:连续特征离散化
tf.feature_column.bucketized_column(
source_column,
boundaries
)
source_column: 必须是numeric_column
boundaries: 不同的桶。boundaries=[0., 1., 2.],产生的bucket就是, (-inf, 0.), [0., 1.), [1., 2.), and [2., +inf), 每一个区间分别表示0, 1, 2, 3,所以相当于分桶分了4个.
example1:输入是二维
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
sess=tf.Session()
features = {
'price':[[2.0,30],[30.0,12],[2,5.0],[3,100.0]]
}
item1_price = tf.feature_column.bucketized_column(tf.feature_column.numeric_column("price",shape=[2,]), boundaries=[1,10,100])
columns = [
item1_price
]
#输入层(数据,特征列)
inputs = tf.feature_column.input_layer(features, columns)
#初始化并运行
init = tf.global_variables_initializer()
#sess.run(tf.tables_initializer())
sess.run(init)
v=sess.run(inputs)
print(v)
output:
[[0. 1. 0. 0. 0. 0. 1. 0.]
[0. 0. 1. 0. 0. 0. 1. 0.]
[0. 1. 0. 0. 0. 1. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 1.]]
example2:输入是一维
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
sess=tf.Session()
features = {
'price':[[2.0],[30.0],[5.0],[100.0]]
}
item1_price = tf.feature_column.bucketized_column(tf.feature_column.numeric_column("price",shape=[1,]), boundaries=[1,10,100])
columns = [
item1_price
]
#输入层(数据,特征列)
inputs = tf.feature_column.input_layer(features, columns)
#初始化并运行
init = tf.global_variables_initializer()
#sess.run(tf.tables_initializer())
sess.run(init)
v=sess.run(inputs)
print(v)
output:
[[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 1. 0. 0.]
[0. 0. 0. 1.]]
5.tf.feature_column.categorical_column_with_identity:类别标识列
tf.feature_column.categorical_column_with_identity("in", num_buckets=10, default_value=0)
可以将 categorical identity column 看成 bucketized column的一个特例。
在一般的 bucketized column 中,每一个 bucket表示值的一个范围(例如,从1960到1979)。
在一个 categorical identity column 中,每个 bucket 表示单个、独一无二的整数。
例如,店铺id虽然数量非常大,但是已经把每个店铺id都从0开始编码,那么就可以用,该特征列的值的范围是[0,num_buckets).
example1:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
sess=tf.Session()
features = {
'b': [[0],[1],[9],[4]] #num_buckets为10,那么b特征列的取值范围是0-9,总之值要小于num_buckets
}
b = tf.feature_column.categorical_column_with_identity("b", num_buckets=10, default_value=0)
b = tf.feature_column.indicator_column(b)
columns = [
b
]
#输入层(数据,特征列)
inputs = tf.feature_column.input_layer(features, columns)
#初始化并运行
init = tf.global_variables_initializer()
sess.run(init)
v=sess.run(inputs)
print(v)
output:
[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]]
6.categorical_column_with_hash_bucket
hashed_feature_column =
tf.feature_column.categorical_column_with_hash_bucket(
key = "some_feature",
hash_bucket_size = 100) # The number of categories
1.当类别的数量特别大时,我们不可能为每个词汇或整数设置单独的类别或者为类别特征提供词汇表有时候会过于繁琐,在词汇表非常大的时候非常消耗内存。 对于此类情况,允许用户指定类别的总数,通过hash的方式来得到最终类别ID。
2.不可避免地会遇到hash冲突的问题,即可有多多个原来不相同的类别会产生相同的类别ID。因此hash_bucket_size的大小应该留有充分的冗余量。实践表明,hash冲突不会对神经网络模型造成太大的影响,哈希类别为模型提供了一些分隔方式,模型可以通过其他特征作进一步区分。
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
sess=tf.Session()
features = {
'title': [["asdc"],["thkj"],["y0bn"],["12gb"]]
}
b = tf.feature_column.categorical_column_with_hash_bucket("title", 20,dtype=tf.string)
b = tf.feature_column.indicator_column(b)
columns = [
b
]
#输入层(数据,特征列)
inputs = tf.feature_column.input_layer(features, columns)
#初始化并运行
init = tf.global_variables_initializer()
sess.run(init)
v=sess.run(inputs)
print(v)
output:
[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]