我使用分类列和哈希桶和Crossed Feature Columns作为功能列,为相当宽和稀疏的数据拟合线性分类器。
后来我想在自定义服务基础架构中使用模型的权重/系数。我知道如何从模型中提取权重,但很明显,对于上述列,它们是针对已经散列的特征值。
我可以使用 tf.string_to_hash_bucket_fast 为简单的分类列重建Hashtable(值 - >散列值),但是我在为交叉要素列执行此操作时遇到了麻烦。
对于构建交叉列的两个分类列的一对值 - 我如何理解他们将进入哪个存储桶?
答案 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))