如何在新数据上使用sklearn TfidfVectorizer

时间:2019-08-21 19:48:02

标签: python scikit-learn nlp nltk

我有一个相当简单的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:尺寸不匹配”

1 个答案:

答案 0 :(得分:1)

一旦使用tf.fit_transform()提取了词汇表以生成稀疏矢量,则需要使用tf.transform()而不是fit_transform()。因此测试集的功能应该是

System.Out

当您在测试/新数据上使用tf.fit_transform()时,它将根据测试数据中可能与您的训练数据不同的单词提取新词汇。词汇上的差异会产生维度失配错误。

您还应该将测试数据和训练数据都组合到一个主集中,然后在该主集中运行fit_transform(),以便即使是仅在测试集中的单词也可以在矢量化器中捕获。您的其余代码可以保持不变。如果测试集中的单词不在训练集中,这样做可以提高准确性。