将可变长度列表数据(从csv)分配到' indicator_column'特征

时间:2018-04-20 10:58:07

标签: python tensorflow machine-learning neural-network deep-learning

我有如下功能:

tf.feature_column.indicator_column(tf.feature_column.categorical_column_with_vocabulary_file(...))

对应的'vocabulary_file'包含如下整数值:

10

20

32

44

5

1212

...

考虑这样的训练样例:

Jack,男,22岁," [10,20]" ,2.33,1

Sara,女,24岁," [32,44,5,1212]" ,5.6,-1

每个训练示例都有一个可变长度列表数据,如 [10,20] [32,44,5,1212]

现在,我想将此数据从csv文件捕获到'indicator_column'功能中,然后将多热表示(结果)提供给深层模型。 decode_csv函数仅支持float32float64int32int64string,我对'list'类型数据有疑问在csv。

  

系统信息:

OS平台:Win8, TensorFlow安装自:二进制, TensorFlow版本:1.5, Python版本:3.6, Bazel版本:无, CUDA / cuDNN版本:无, GPU模型和存储器:GPU>没有| CPU> AMD(Phenom II x4),

重现的确切命令很明确。

2 个答案:

答案 0 :(得分:0)

这里有两个问题。首先,官方CSV格式没有任何递归概念 - 单个单元格实际上是要解析的多个值。

如果通过调用decode_csv两次(ipython REPL使用急切执行)内部列表的大小不变,您可以实现所需的目标:

In [21]: a, b, c = tf.decode_csv(tf.constant('"Jack","10, 20",1'), ["", "", 0])

In [22]: tf.decode_csv(b, [0, 0])
Out[22]: 
[<tf.Tensor: id=113, shape=(), dtype=int32, numpy=10>,
 <tf.Tensor: id=114, shape=(), dtype=int32, numpy=20>]

但是,官方CSV格式也不支持可变长度数据 - 每行应该具有相同数量的字段/列。

鉴于CSV的所有这些限制,我建议采用以下替代方法(假设您希望保留文本 - 如果没有,您可以在TFRecord中对数据进行编码):

答案 1 :(得分:0)

您可以像这样使用sklearn.preprocessing.MultiLabelBinarizertf.feature_column.indicator_column

mlb = sklearn.preprocessing.MultiLabelBinarizer()
mlb.fit([item.split(",") for item in user_df[column]])
multi_hot_column_dict[column] = tf.feature_column.indicator_column(tf.feature_column.categorical_column_with_vocabulary_list(column, mlb.classes_))