TypeError:预期的二进制或 unicode 字符串,得到 [

数据挖掘 预测建模 张量流 模型选择
2021-10-07 16:35:06

错误摘要:

我收到以下错误:

TypeError: Expected binary or unicode string, got [

背景:

我有几个功能是用户活动的历史记录。我试图y_train根据他们不同类型动作的历史来预测给定用户是否会采取动作(在下面的列表中用 0 或 1 表示)。例如,一个特征可能是button_A_click_per_day,给定用户的历史记录可能是过去 365 天内每天点击按钮 A 的向量。

我的代码的相关片段如下:

import tensorflow as tf

# Build feature columns for classifier
feature_columns = []
for key in X_train:
    col = tf.feature_column.numeric_column(
        key=key, 
        shape=max_width,
    )
    feature_columns.append(col)

# Build classifier
classifier = tf.estimator.DNNClassifier(
    feature_columns=my_feature_columns,
    hidden_units=[10, 10],
    n_classes=2,
)

X_train 的结构如下:

>>> X_train['<feature_name>']
129     [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
...
1294    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
860     [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
Name: <feature_name>, Length: 1377, dtype: object

我的火车输入功能如下:

def train_input_fn(features, labels, batch_size):
    dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
    dataset = dataset.shuffle(buffer_size=1000).repeat(count=None).batch(batch_size)
    return dataset.make_one_shot_iterator().get_next()

最后,当发出以下命令时...

classifier.train(
    # input_fn is a fn that takes not arguments and returns an iterator.
    input_fn=lambda: train_input_fn(X_train, y_train, batch_size=100),
    steps=1000,
)

我得到错误:

~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/tensorflow/python/util/compat.py in as_bytes(bytes_or_text, encoding)
     63   else:
     64     raise TypeError('Expected binary or unicode string, got %r' %
---> 65                     (bytes_or_text,))
     66 
     67 

TypeError: Expected binary or unicode string, got [0.0, 0.0, 0...

我的问题:

  1. 你知道我做错了什么来得到这个错误吗?
  2. 有没有更好的方法来对历史特征进行建模?
3个回答

您应该使用内置函数 fortrain_input_fn而不是自己编写。例如:

train_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": np.array(training_set.data)},
    y=np.array(training_set.target),
    num_epochs=None,
    shuffle=True)

这里的 TensorFlow 文档中有一个完整的示例

对我来说,原因是decimal某些列的类型不正确;通过使用来修复float

我有类似的经历,pd.Series#tolist()显然是通过打电话解决的。这是一个完整的例子。

import tensorflow as tf
import pandas as pd
def get_dataset():
    data = [['Tom', 'M', 95], ['Jerry', 'M', 96], ['Tonny', 'M', 97], ['Lisa', 'F', 98]]
    dataframe = pd.DataFrame(data=data, columns=['name', 'gender', 'score'])
    labels = dataframe.pop('score')
    features = dict()
    # call `pd.Series#tolist()` apparently
    for col_name in dataframe.columns:
        features[col_name] = dataframe[col_name].tolist()
    dataset = tf.data.Dataset.from_tensor_slices((features, labels))
    dataset=dataset.batch(2)
    return dataset

dataset=get_dataset()
features,labels = dataset.make_one_shot_iterator().get_next()

with tf.Session() as sess:
    print(sess.run([features,labels]))
    print(sess.run([features,labels]))
"""
[({'name': array([b'Tom', b'Jerry'], dtype=object), 'gender': array([b'M', b'M'], dtype=object)}, array([95, 96], dtype=int64))]
[({'name': array([b'Tonny', b'Lisa'], dtype=object), 'gender': array([b'M', b'F'], dtype=object)}, array([97, 98], dtype=int64))]
"""