在列车测试拆分之前或之后进行处理

时间:2019-08-28 13:15:21

标签: keras scikit-learn nlp tokenize train-test-split

我正在使用这篇出色的文章来学习机器学习。

https://stackabuse.com/python-for-nlp-multi-label-text-classification-with-keras/

作者将X和y数据拆分后已标记化。

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.20, random_state=42
)

tokenizer = Tokenizer(num_words=5000)
tokenizer.fit_on_texts(X_train)

X_train = tokenizer.texts_to_sequences(X_train)
X_test = tokenizer.texts_to_sequences(X_test)

vocab_size = len(tokenizer.word_index) + 1

maxlen = 200

X_train = pad_sequences(X_train, padding="post", maxlen=maxlen)
X_test = pad_sequences(X_test, padding="post", maxlen=maxlen)

如果我在使用train_test_split类之前将其标记化,则可以保存几行代码。

tokenizer = Tokenizer(num_words=5000)
tokenizer.fit_on_texts(X)

X_t = tokenizer.texts_to_sequences(X)
vocab_size = len(tokenizer.word_index) + 1
maxlen = 200

X = pad_sequences(X_t, padding="post", maxlen=maxlen)

我只想确认我的方法是正确的,并且在脚本的后面不会感到意外。

3 个答案:

答案 0 :(得分:5)

这两种方法都将在实践中起作用。但是将令牌化器拟合到训练集上并将其应用于训练集和测试集要比拟合整个数据集更好。确实,使用第一种方法时,您正在模仿以下事实:部署模型后,模型中看不见的单词会出现在某个点上。因此,您的模型评估将更接近生产环境中的情况。

答案 1 :(得分:3)

要添加到Simons的帖子,我想说甚至在拆分之前都禁止标记化。

该算法将从标记器中学习数据,这严格用于测试算法。这是训练和测试集之间的主要方法。

答案 2 :(得分:3)

同意@desertnaut的评论,该问题更适合“ Cross Validated”,您将在此得到更好的回答。但是我仍然想发表评论。

  

TL; DR: 不要这样做,交叉污染您的训练和测试集通常不是一个好主意。这样做在统计上是不正确的。

Tokenizer.fit_to_texts(dictionary)进行单词索引,即它将任何单词序列转换为数字(向量表示),因此,训练和测试集之间的词汇差异可能不是空集,即如果Tokenizer对象仅使用火车数据,则测试中的某些单词将不存在于referenzen对象构建的单词索引器中。如果仅在训练集上对令牌生成器进行了训练,这可能会导致某些测试集生成不同的向量。

由于应该将学习问题中的测试集隐藏起来,因此在任何训练过程中使用该模型在统计上都是不正确的。