训练测试拆分之前或之后的处理

sha*_*nuo 5 nlp tokenize scikit-learn keras 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)
Run Code Online (Sandbox Code Playgroud)

如果我在使用 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)
Run Code Online (Sandbox Code Playgroud)

我只是想确认我的方法是正确的,我不希望脚本后面有任何惊喜。

Sim*_*urt 8

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


Min*_*ato 6

同意@desertnaut 的评论,即该问题更适合“交叉验证”,您会在那里得到更好的回答。但我还是想说一句。

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

Tokenizer.fit_to_texts(dictionary)做字索引,即它建立你的任何单词序列的数字(向量表示)的转换,所以它可能是训练和测试集之间的词汇差异不是空集,即一些在测试的话Tokenizer如果对象仅使用训练数据,则不会出现在由对象构建的单词索引器中。这可能导致在一些测试集合生成不同的载体,如果你已经受过训练只能在训练集的分词器。

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