【问题标题】:How do you check that a trained vocab and TfidfVectorizer is applied correctly to another corpus?你如何检查一个训练有素的词汇和 TfidfVectorizer 是否正确地应用于另一个语料库?
【发布时间】:2019-12-24 21:38:29
【问题描述】:

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

换句话说,我从训练集中保存了一个 vocab 和 nmodel,然后我用保存的词汇创建了 TFidfVectorizer,最后我在新的验证笔记上使用了“fit_transform”。

这是否仅应用经过训练的词汇和模型?它不是从验证集中“学习”任何新东西吗?

训练,然后加载词汇和模型并应用于验证集:

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)```

【问题讨论】:

  • 你描述的方式,它绝对IS从新的验证集学习,事实上你告诉它忽略从训练集。不要在验证数据上使用fit_transform,而应该只使用.transform(),因为fit_ 步骤会重新训练模型

标签: python nlp tfidfvectorizer


【解决方案1】:

回答您的问题:

这是否仅应用经过训练的词汇和模型?

正如@G 所说。 Anderson 作为对您的回答的评论,当您调用“fit”时,您正在将 Tf-idf 字典重新调整为您的新数据 - 这意味着为单词赋予新的权重(我假设您知道什么是 TF-IDF)。因此,为了能够使用经过训练的词汇,请仅使用:

vocab = pickle.load(open('./vocab/' + '_vocab.pkl', 'rb'))
tfidf_vectorizer = TfidfVectorizer(vocabulary = vocab)    
valid_vector = tfidf_vectorizer.transform(validation_notes)

假设您应用了上述更正,则可以回答第二个问题:

它不是从验证集中“学习”任何新东西吗?

不,您只是在验证它。您使用相同的 tf-idf 矢量化,因为您想根据原始数据拟合新条目 - 为此,您有一组自定义的权重来描述您的模型最重视的词。如果您不断更改 tf-idf 字典,您将拥有不同的权重(如果您考虑大量数据,它们可以取平均值,但我认为这不是事实)。

所以,一旦你有了一个模型和一个 tf-idf 计算,一切都是固定的,除了你记录数据以进一步增强模型外,什么都不会学到。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2020-12-03
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    相关资源
    最近更新 更多