Python 在整个x_数据上,还是仅在序列数据上,Keras拟合_到_文本更好?

Python 在整个x_数据上,还是仅在序列数据上,Keras拟合_到_文本更好?,python,keras,tokenize,Python,Keras,Tokenize,我有一个带有文本列的数据框。我将它们分为x\u列和x\u测试 我的问题是,在整个x数据集上使用Keras的Tokenizer.fit_on_text()还是只使用x_train 像这样: tokenizer = Tokenizer() tokenizer.fit_on_texts(x_data) 或 tokenizer.fit_on_text(x_train)#虽然中的信息很好,但确实有更重要的事情需要注意: 您必须在培训和测试数据中使用相同的标记器 否则,每个数据集将有不同的标记。每个标记器

我有一个带有文本列的数据框。我将它们分为
x\u列
x\u测试

我的问题是,在整个
x
数据集上使用Keras的
Tokenizer.fit_on_text()
还是只使用
x_train

像这样:

tokenizer = Tokenizer()
tokenizer.fit_on_texts(x_data)


tokenizer.fit_on_text(x_train)#虽然中的信息很好,但确实有更重要的事情需要注意:

您必须在培训和测试数据中使用相同的标记器

否则,每个数据集将有不同的标记。每个标记器都有一个内部字典,该字典是用
fit\u on\u text
创建的

不能保证训练数据和测试数据具有相同频率的相同单词,因此每个数据集将创建不同的字典,并且测试数据的所有结果都将是错误的

这也意味着您不能再
fit_on_text
、训练然后
fit_on_text
:这将更改内部词典

有可能对整个数据进行拟合。但是,最好为“未知”单词保留一个标记(
oov_token=True
),以便在您发现新的测试数据时使用您的模型从未见过的单词(这要求您也用该标记替换训练数据中的罕见单词)

正如@Fernando H Meted所述,仅使用列车数据拟合标记器可能更好(尽管,即使在培训数据中,您也必须保留oov标记(模型必须了解如何处理oov)


使用未知单词测试标记器: 下面的测试表明,当未设置
oov_token
时,标记器完全忽略未知单词。这可能不是一个好主意。未知单词可能是句子中的关键词,简单地忽略它们可能比知道其中存在未知内容更糟糕

import numpy as np
from keras.layers import *
from keras.models import Model
from keras.preprocessing.text import Tokenizer

training = ['hey you there', 'how are you', 'i am fine thanks', 'hello there']
test = ['he is fine', 'i am fine too']

tokenizer = Tokenizer()
tokenizer.fit_on_texts(training)

print(tokenizer.texts_to_sequences(training))
print(tokenizer.texts_to_sequences(test))
产出:

[[3, 1, 2], [4, 5, 1], [6, 7, 8, 9], [10, 2]]
[[8], [6, 7, 8]]
[[4, 2, 3], [5, 6, 2], [7, 8, 9, 10], [11, 3]]
[[1, 1, 9], [7, 8, 9, 1]]
现在,这表明标记器将把索引1添加到所有未知单词:

tokenizer2 = Tokenizer(oov_token = True)
tokenizer2.fit_on_texts(training)
print(tokenizer2.texts_to_sequences(training))
print(tokenizer2.texts_to_sequences(test))
产出:

[[3, 1, 2], [4, 5, 1], [6, 7, 8, 9], [10, 2]]
[[8], [6, 7, 8]]
[[4, 2, 3], [5, 6, 2], [7, 8, 9, 10], [11, 3]]
[[1, 1, 9], [7, 8, 9, 1]]

但是,将训练数据中的一组罕见单词也替换为1可能会很有趣,因此您的模型对如何处理未知单词有了概念。

非常感谢您的回答!我对这个问题做了噩梦,与我交谈的人似乎都没有看到问题。我真的很高兴so分数高的人有answered it.对整个数据集进行拟合文本对我来说似乎有点数据泄露。只有一个问题,你知道有没有研究论文解决了使用所有数据集创建训练词汇表的问题?@xicocaio将数据集划分为训练和测试的主要思想是评估你的模型,以应对未来未知情况一种客观的方法。也就是说,如果你在整个数据集上使用标记器,你会在某种程度上使你的模型产生偏差。为了对你的模型进行良好的评估,你必须考虑到未知标记。任何其他类型的“特征提取”也是如此最好的做法是只在列车上安装,并应用于所有车辆。@Hiyam One tokenization only,您必须为将来的数据保留标记器,模型必须一致地看到相同的标记。
fit on_uuon_uutext
,只能在整个数据上使用一次(因此在拆分之前)。请注意答案中关于稀有词的注释(这将很重要)。您不能在文本上多次使用
fit\u
。稍后您可以按您想要的方式拆分数据(您可以拆分已标记或未标记的数据,在调用
text\u到\u序列时没有问题)你们不认为在整个数据集上进行拟合会在验证和测试集上产生“比实际更好”的结果吗?我的意思是,模型在预测阶段有可能找到未知单词,所以在评估阶段消除这种机会会产生不反映实际预测性能的结果。我认为nk仅使用oov_标记对训练数据进行标记是描述评估和测试阶段未来结果性能的更好方法。我错了吗?