具有词汇表的Tensorflow分类数据-预期的二进制或Unicode字符串,得到[0,1,2,…]

时间:2018-08-09 04:31:44

标签: python dataframe tensorflow machine-learning categorical-data

我是机器学习的新手(刚刚完成了Google机器学习速成课程),并认为参加Kaggle竞赛是解决某些实际问题的良好起点。我正在使用最新的Tensorflow和Python 3(Kaggle在线Jupyter笔记本)

数据在如下所示的数据框中格式化

|Identity | Cuisine | Ingredients                |
|---------|---------|----------------------------|
|1        | italian | [beans, milk,..., tomatoes]|
|2        | indian  | [chicken, curry leaf,...]  |

我制作了一个词汇表列表生成器来创建一个词汇表集,然后用该词汇表集中的成分索引来替换Ingredients数组中这些单词的实例,所以我的原始数据如下所示。

|Identity | Cuisine | Ingredients |
|---------|---------|-------------|
|1        | italian |[0, 1,..., 4]|
|2        | indian  |[5, 6,...]   |

为方便起见,我将标签(烹饪)和特征(成分)分为2个单独的数据框,并且我在配料数组中使用了tf.feature_column.categorical_column_with_vocabulary_list和随后的tf.feature_column.indicator_column

但是现在我的模型出现问题,无法读取ingredients列并出现错误

  

TypeError:预期的二进制或Unicode字符串,得到[0,1,2,3,4,5,6,7,8,9]

我的输入功能如下

def input_fn(features,labels,batch_size,num_epochs=None,shuffle=True):
    ds = Dataset.from_tensor_slices((features,labels))
    ds = ds.batch(batch_size).repeat(num_epochs)

    if shuffle:
        ds = ds.shuffle(10000)

    feature_batch, label_batch = ds.make_one_shot_iterator().get_next()
    return feature_batch, label_batch

将其馈入如下所示的简单函数

training_func = lambda: input_fn(training_example,training_target,batch_size)
validati_func = lambda: input_fn(validation_example,validation_target,batch_size)

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
optimizer = tf.contrib.estimator.clip_gradients_by_norm(optimizer, 5.0)

classifier.train(
    input_fn=training_func,
    steps=steps_per_period
)

我的问题是如何解决此TypeError

  

TypeError:预期的二进制或Unicode字符串,得到[0,1,2,3,4,5,6,7,8,9]

(为清楚起见)

此外,我还想知道是否存在处理这种数据格式的最佳实践? (以及是否有内置功能可以处理此问题)

由于这可能是一个繁琐的代码问题,所以我将整个代码添加到在线Pastebin paste中,以便您可以检出代码。我正在使用的数据集来自Kaggle What's Cooking competition

0 个答案:

没有答案