用一些不在训练集中的单词预测分类(朴素贝叶斯)



我创建了一个朴素贝叶斯模型来预测结果是"负"还是"正"。我遇到的问题是在一组新数据上运行模型,其中一些单词不在模型中。我在预测新数据集时收到的错误是:

ValueError:预期输入有6个功能,得到4个而不是

我读到我必须在我的模型中放一个拉普拉斯平滑器,而伯努利()已经有了默认的alpha值1。我还能做些什么来修复我的错误?谢谢

from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import BernoulliNB
from sklearn import cross_validation
from sklearn.metrics import classification_report
import numpy as np
from sklearn.metrics import accuracy_score
import textblob as TextBlob

#scikit
comments = list(['happy','sad','this is negative','this is positive', 'i like this', 'why do i hate this'])
classes = list(['positive','negative','negative','positive','positive','negative'])

# preprocess creates the term frequency matrix for the review data set
stop = stopwords.words('english')
count_vectorizer = CountVectorizer(analyzer =u'word',stop_words = stop, ngram_range=(1, 3))
comments = count_vectorizer.fit_transform(comments)
tfidf_comments = TfidfTransformer(use_idf=True).fit_transform(comments)

# preparing data for split validation. 60% training, 40% test
data_train,data_test,target_train,target_test = cross_validation.train_test_split(tfidf_comments,classes,test_size=0.2,random_state=43)
classifier = BernoulliNB().fit(data_train,target_train)
#new data
comments_new = list(['positive','zebra','george','nothing'])
comments_new = count_vectorizer.fit_transform(comments_new)
tfidf_comments_new = TfidfTransformer(use_idf=True).fit_transform(comments_new)
classifier.predict(tfidf_comments_new)

您不应该使用fit_transform在新数据上拟合新的估计器,而应该使用以前构建的count_vectorizer,只使用transform。这将忽略字典中没有的所有单词。

我不同意Maxim的观点:虽然这对CountVectorizer没有影响,但在连接的数据集上使用TfidfTransformer会将信息从测试集泄漏到训练集,这是你需要避免的。

您正在从"comments"单词创建一个计数矩阵。在创建计数矩阵时,必须使用问题中可能遇到的所有单词。想象一下创建成员矩阵时的简单情况。每列表示特定单词,每行表示数据集中的特定示例(例如,电子邮件文本)。若特定单词不在示例中,则矩阵保持0,若在示例中则矩阵保持1。显然,如果你为包含100个不同单词的电子邮件构建了这样的矩阵,那么矩阵将有100列。但是,如果在那之后,你试图对新数据使用经过训练的分类器,在这些数据中你会有一些新单词,而这些单词不在训练集中,那么它就会失败。因为原始矩阵中并没有列来保存这些新词的值。因此,再次强调,在文本的矢量化过程中,您必须提供在训练和测试数据集中将要面对的所有术语。

因此,您必须将comments和comments_new合并到一个列表中,并根据合并的列表调用CountVectorizer和tfidfTransformer,而不是针对"comments"调用CountVector和tfidf Transformer。

相关内容

  • 没有找到相关文章

最新更新