我是机器学习的新手(刚刚完成了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