Python 如何检查经过培训的vocab和TFIDFvectorier是否正确应用于另一个语料库?

Python 如何检查经过培训的vocab和TFIDFvectorier是否正确应用于另一个语料库?,python,nlp,tfidfvectorizer,Python,Nlp,Tfidfvectorizer,我试图在一个集合上训练一个NLP模型,保存vocab和模型,然后将其应用于一个单独的验证集合。代码正在运行,但如何确保它按预期工作 换句话说,我从训练集中保存了vocab和nmodel,然后用保存的词汇创建了TFIDFvectorier,最后在新的验证注释上使用“fit_transform” 这是否仅适用于经过培训的vocab和模型?它不是从验证集中“学习”了什么新东西吗 培训,然后加载vocab和模型并应用于验证集: train_vector = tfidf_vectorizer.fit_tr

我试图在一个集合上训练一个NLP模型,保存vocab和模型,然后将其应用于一个单独的验证集合。代码正在运行,但如何确保它按预期工作

换句话说,我从训练集中保存了vocab和nmodel,然后用保存的词汇创建了TFIDFvectorier,最后在新的验证注释上使用“fit_transform”

这是否仅适用于经过培训的vocab和模型?它不是从验证集中“学习”了什么新东西吗

培训,然后加载vocab和模型并应用于验证集:

train_vector = tfidf_vectorizer.fit_transform(training_notes)
pickle.dump(tfidf_vectorizer.vocabulary_, open('./vocab/' + '_vocab.pkl', 'wb'))
X_train = train_vector.toarray()
y_train = np.array(train_data['ref_std'])
model.fit(X_train, y_train)
dump(model, './model/' + '.joblib')
train_prediction = model.predict(X_train)


vocab = pickle.load(open('./vocab/' + '_vocab.pkl', 'rb'))
tfidf_vectorizer = TfidfVectorizer(vocabulary = vocab)    
valid_vector = tfidf_vectorizer.fit_transform(validation_notes)
X_valid = valid_vector.toarray()
y_valid = np.array(validation_data['ref_std'])
model = load('./model/' + '.joblib')
valid_prediction = model.predict(X_valid)```

回答您的问题:

这是否仅适用于经过培训的vocab和模型

正如@G.Anderson在对您的回答的评论中所述,当您调用“fit”时,您正在将Tf idf dict重新安装到您的新数据中——这意味着为单词赋予新的权重(我假设您知道是什么)。因此,为了能够使用经过培训的vocab,请仅使用:

vocab = pickle.load(open('./vocab/' + '_vocab.pkl', 'rb'))
tfidf_vectorizer = TfidfVectorizer(vocabulary = vocab)    
valid_vector = tfidf_vectorizer.transform(validation_notes)
假设您应用了上述更正,则可以回答第二个问题:

它不是从验证集中“学习”了什么新东西吗

不,你只是在验证它。您使用相同的tf idf矢量化,因为您希望基于原始数据拟合新条目-为此,您有一组自定义权重,描述您的模型值最大的单词。如果你不断改变你的TF IDF DICT,你会有不同的权重(如果你考虑很多数据,它们可以平均,但是我假设这不是TE事实)。
因此,一旦你有了一个模型和tf idf计算,一切都是固定的,除了记录数据以进一步增强模型外,什么也学不到。

按照你所描述的方式,它绝对是在从新的验证集学习,事实上你告诉它忽略从训练集中学习到的词汇和权重。您不应该对验证数据使用
fit\u transform
,而应该只使用
.transform()
,因为
fit\u
步骤会重新训练模型