Tensorflow:检查分类和特征列的哈希桶

时间:2017-11-14 09:38:43

标签: python tensorflow

我使用分类列和哈希桶Crossed Feature Columns作为功能列,为相当宽和稀疏的数据拟合线性分类器。

后来我想在自定义服务基础架构中使用模型的权重/系数。我知道如何从模型中提取权重,但很明显,对于上述列,它们是针对已经散列的特征值。

我可以使用 tf.string_to_hash_bucket_fast 为简单的分类列重建Hashtable(值 - >散列值),但是我在为交叉要素列执行此操作时遇到了麻烦。

对于构建交叉列的两个分类列的一对值 - 我如何理解他们将进入哪个存储桶?

1 个答案:

答案 0 :(得分:3)

在检查源代码后,我发现最简单的方法是为输入数据构建一个输入层,该输入数据由列中的所有不同值(或它们的组合)组成。

结果你得到一个由0和1组成的DenseTensor,每一行对应一个不同的值,其中1s位于对应于实际哈希桶号的列中(我已经验证了对于分类列,对于CrossedColumns应该是相同的。)

以下是示例代码(适用于分类列交叉列):

import tensorflow as tf
from tensorflow.python.feature_column import feature_column as fc

actual_sex = {'sex': tf.Variable(['male', 'female', 'female', 'male'], tf.string)}
actual_nationality = {'nationality': tf.Variable(['belgian', 'french', 'belgian', 'belgian'], tf.string)}
actual_sex_nationality = dict(actual_sex, **actual_nationality)

# hashed_column
sex_hashed_raw = fc.categorical_column_with_hash_bucket("sex", 10)
sex_hashed = fc.indicator_column(sex_hashed_raw)

# crossed column
crossed_sn_raw = fc.crossed_column(['sex', 'nationality'], hash_bucket_size = 20)
crossed_sn = fc.indicator_column(crossed_sn_raw)

layer_s = tf.feature_column.input_layer(actual_sex_nationality, sex_hashed)
layer_sn = tf.feature_column.input_layer(actual_sex_nationality, crossed_sn)

sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

print(sess.run(layer_s))
print(sess.run(layer_sn))