如何在新数据上使用sklearn TfidfVectorizer

5

我有一个相当简单的NLTK和sklearn分类器(我是个彻底的新手)。

我进行常规的导入操作。

import pandas as pd
import matplotlib.pyplot as plt

from sklearn.feature_extraction.text import CountVectorizer
from nltk.tokenize import RegexpTokenizer

from sklearn.model_selection import train_test_split

from sklearn.naive_bayes import MultinomialNB

from sklearn import metrics

from sklearn.feature_extraction.text import TfidfVectorizer

我加载了数据(已经清理完毕)。这是一个非常简单的数据框,有两列。第一列是 'post_clean',其中包含清理过的文本,第二列是 'uk',其值为TrueFalse

data = pd.read_pickle('us_uk_posts.pkl')

然后我使用tfidf进行向量化并拆分数据集,接着创建模型。

tf = TfidfVectorizer()
text_tf = tf.fit_transform(data['post_clean'])
X_train, X_test, y_train, y_test = train_test_split(text_tf, data['uk'], test_size=0.3, random_state=123)


clf = MultinomialNB().fit(X_train, y_train)
predicted = clf.predict(X_test)
print("MultinomialNB Accuracy:" , metrics.accuracy_score(y_test,predicted))

显然,除非我完全错了,我有93%的准确度。

我的两个问题是:

1)如何使用此模型对一些没有已知“UK”值的项目进行分类?

2)如何使用完全独立的测试集(我没有拆分)测试此模型?

我尝试过:

new_data = pd.read_pickle('new_posts.pkl')

其中new_posts数据格式相同。

new_text_tf = tf.fit_transform(new_data['post_clean'])

predicted = clf.predict(new_X_train)
predicted

并且

new_text_tf = tf.fit_transform(new_data['post_clean'])

new_X_train, new_X_test, new_y_train, new_y_test = train_test_split(new_text_tf, new_data['uk'], test_size=1)

predicted = clf.predict(new_text_tf)
predicted

但两者都会返回 "ValueError: dimension mismatch" 的错误信息。

1个回答

4

在使用tf.fit_transform()提取词汇生成稀疏向量进行训练后,您需要使用tf.transform()而不是fit_transform()。因此,测试集的特征应该是:

new_text_tf = tf.transform(new_data['post_clean'])

当你在测试/新数据上使用tf.fit_transform()时,它会基于测试数据中的单词提取一个新的词汇表,这个词汇表可能与训练数据不同。词汇表的差异会导致维度不匹配错误。
您还应该将测试数据和训练数据组合成一个主数据集,然后在此主数据集上运行fit_transform(),以便捕获仅存在于测试集中的单词。其余代码保持不变。这样做可以提高准确性,特别是当测试集中有未在训练集中出现的单词时。

1
谢谢您的解释。我已经调整了代码,现在它是tf.transform。虽然我没有合并这两个集合,因为我想模拟在现实世界中运行时不可能每次都合并这些集合。但是我仍然遇到了维度不匹配的问题,有没有什么方法可以解决这个问题?理想情况下,我希望有一个函数,我可以输入任何“post”文本,它会输出预测的分类。 - Charlie Morton
1
在您的测试数据的第一个代码块中,应该是predicted = clf.predict(new_text_tf),而不是predicted = clf.predict(new_X_train)。另外,new_text_tf和X_train的形状是什么? - Adnan S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接