Pandas Dataframe,TensorFlow数据集:在哪里执行TensorFlow标记化步骤?

2024-10-01 22:36:46 发布

您现在位置:Python中文网/ 问答频道 /正文

在TensorFlow的Keras的帮助下,我正在研究一个逻辑回归模型来预测客户是商业客户还是非商业客户。目前,在tf.feature_columns的帮助下,我能够使用像latitude这样的列。现在我正在处理NAME1字段。该名称通常有重复的部分,如“GmbH”(如“Mustermann GmbH”),在本上下文中,该名称与“公司”具有类似的含义,该公司表示该客户为商业客户。为了分离名称的所有不同部分并分别使用它们,我在函数text_to_word_sequence()的帮助下使用了标记化。 我将数据导入Pandas数据框,然后使用函数from_tensor_slices()将此数据框转换为TensorFlow数据集,以便使用函数tf.feature_columns。 我尝试了两种不同的标记化策略:

  1. 将熊猫数据帧转换为TensorFlow数据集之前的标记化 导入数据帧后,我使用Pandas数据帧方法apply()在数据帧内创建一个新的标记化列: data['NAME1TOKENIZED'] = data['NAME1'].apply(lambda x: text_to_word_sequence(x)) 新柱具有以下结构:
    0                            [palle]
    1                            [pertl]
    2                     [graf, robert]
    3        [löberbauer, stefanie, asg]
    4             [stauber, martin, asg]
                        ...             
    99995                       [truber]
    99996                       [mesgec]
    99997                       [mesgec]
    99998                        [miedl]
    99999                    [millegger]
    Name: NAME1TOKENIZED, Length: 100000, dtype: object

如您所见,列表中有不同数量的条目,因此我在将Dataframe转换为数据集时遇到问题: ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list). 我还尝试了tf.ragged.constant()函数来创建一个不规则的张量,它允许这种类型的列表。 下面是我将数据帧转换为数据集的函数:

def df_to_dataset(dataframe, shuffle=True, batch_size=32):
    dataframe = dataframe.copy()
    tok_names = dataframe.loc[:,'NAME1TOKENIZED']
    del dataframe['NAME1TOKENIZED']
    rt_tok_names = tf.ragged.constant(tok_names)
    labels = dataframe.pop('RECEIVERTYPE')
    labels = labels - 1
    ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), rt_tok_names, labels))
    if shuffle:
        ds = ds.shuffle(buffer_size=len(dataframe))
    ds = ds.batch(batch_size)
    return ds

这很有效,但正如你所想象的,现在我在另一边遇到了一个问题。当我现在尝试使用以下功能时:

name_embedding = tf.feature_column.categorical_column_with_hash_bucket('NAME1TOKENIZED', hash_bucket_size=2500)

我得到以下错误:

ValueError: Feature NAME1TOKENIZED is not in features dictionary.

我还尝试在tf.ragged.constant()中输入一个数据帧而不是序列,这样我就可以使用dict(rt_tok_names)来传递标签,但是我再次遇到以下错误: ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list)

  1. 将熊猫数据帧转换为TensorFlow数据集后的标记化 我尝试过以下方法,例如:

train_ds.map(lambda x, _: text_to_word_sequence(x['NAME1']))

但我得到了以下错误: AttributeError: 'Tensor' object has no attribute 'lower'

正如你所看到的,我尝试了好几种方法,但都没有成功。我很乐意为您提供解决问题的建议

谢谢


Tags: to数据函数标记dataframesizelabels客户
1条回答
网友
1楼 · 发布于 2024-10-01 22:36:46

我找到了解决问题的办法。我使用标记器将文本转换为序列,然后将每行的序列列表填充到最大长度为2。最后,我将这两个新列添加到Dataframe中。之后,我能够将数据帧转换为数据集,然后在tf.feature_column的帮助下使用这两列 以下是相关代码:

t = Tokenizer(num_words=name_num_words)
t.fit_on_texts(data['NAME1PRO'])
name1_tokenized = t.texts_to_sequences(data['NAME1PRO'])

name1_tokenized_pad = tf.keras.preprocessing.sequence.pad_sequences(name1_tokenized, maxlen=2, truncating='pre')

data = pd.concat([data, pd.DataFrame(name1_tokenized_pad, columns=['NAME1W1', 'NAME1W2'])], axis=1)

相关问题 更多 >

    热门问题