TfIdf矩阵为BernoulliNB返回错误的特征数

时间:2015-10-05 09:37:07

标签: python scikit-learn tf-idf naivebayes

使用python lib sklearn,我尝试从训练集中提取特征,并使用这些数据拟合BernoulliNB分类器。

在训练分类器后,我想预测(分类)一些新的测试数据。 不幸的是我收到了这个错误:

Traceback (most recent call last):
File "sentiment_analysis.py", line 45, in <module> main()
File "sentiment_analysis.py", line 41, in main
  prediction = classifier.predict(tfidf_data)
File "\Python27\lib\site-packages\sklearn\naive_bayes.py", line 64, in predict
  jll = self._joint_log_likelihood(X)
File "\Python27\lib\site-packages\sklearn\naive_bayes.py", line 724, in _joint_log_likelihood
  % (n_features, n_features_X))
ValueError: Expected input with 4773 features, got 13006 instead

这是我的代码:

#Train the Classifier
data,target = load_file('validation/validation_set_5.csv')
tf_idf = preprocess(data)
classifier = BernoulliNB().fit(tf_idf, target)

#Predict test data
count_vectorizer = CountVectorizer(binary='true')
test = count_vectorizer.fit_transform(test)
tfidf_data = TfidfTransformer(use_idf=False).fit_transform(test)
prediction = classifier.predict(tfidf_data)

1 个答案:

答案 0 :(得分:1)

这就是您遇到此错误的原因:

test = count_vectorizer.fit_transform(test)
tfidf_data = TfidfTransformer(use_idf=False).fit_transform(test)

你应该在这里只使用旧的变形金刚(CountVectorizer和TfidfTransformer是你的变形金刚)安装在火车上。

  

fit_transform

意味着您将这些变换器放在新的集合上,丢失有关旧拟合的所有信息,然后使用此变换器转换'test'(在新样本上学习,并使用不同的功能集)。因此,它返回转换为新功能集的testset,与训练集中使用的旧功能集不兼容。要解决这个问题,你应该在训练集上安装的旧变形金刚上使用transform(not fit_transform)方法。

你应该写一些类似的东西:

test = old_count_vectorizer.transform(test)
tfidf_data = old_tfidf_transformer.transform(test)