CountVectorizer MultinomialNB中的尺寸不匹配错误

时间:2017-08-21 19:14:25

标签: python naivebayes countvectorizer train-test-split

在我提出这个问题之前,我不得不说我已经在这个董事会上彻底阅读了超过15个类似的主题,每个主题都有不同的推荐,但所有这些主题都让我无法理解。

好的,所以我将“垃圾邮件”文本数据(最初采用csv格式)分成训练和测试集,使用CountVectorizer及其“fit_transform”函数来拟合语料库的词汇表,并从文本中提取单词计数功能。然后我应用MultinomialNB()来学习训练集并在测试集上进行预测。这是我的代码(简化):

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cross_validation import train_test_split
from sklearn.naive_bayes import MultinomialNB

# loading data 
# data contains two columns ('text', 'target')

spam = pd.read_csv('spam.csv')
spam['target'] = np.where(spam_data['target']=='spam',1,0)

# split data
X_train, X_test, y_train, y_test = train_test_split(spam_data['text'], spam_data['target'], random_state=0) 

# fit vocabulary and extract word count features
cv = CountVectorizer()
X_traincv = cv.fit_transform(X_train)  
X_testcv = cv.fit_transform(X_test)

# learn and predict using MultinomialNB
clfNB = MultinomialNB(alpha=0.1)
clfNB.fit(X_traincv, y_train)

# so far so good, but when I predict on X_testcv
y_pred = algo.predict(X_testcv)

# Python throws me an error: dimension mismatch

我从之前的问题主题中收集的建议是(1)在X_test上仅使用.transform(),或者(2)确定原始垃圾邮件数据中的每一行是否为字符串格式(是的,它们是),或者(3)对X_test什么都不做。但是他们所有人都没有响铃,Python不断给我“维度不匹配”的错误。经过4个小时的努力,我不得不屈服于Stackoverflow。如果有人能够启发我,我们将非常感激。只是想知道我的代码出了什么问题,以及如何使维度正确。

谢谢。

顺便说一下,原始数据条目看起来像这样

_

                                         test   target
0 Go until jurong point, crazy.. Available only    0
1 Ok lar... Joking wif u oni...                    0
2 Free entry in 2 a wkly comp to win FA Cup fina   1
3 U dun say so early hor... U c already then say   0
4 Nah I don't think he goes to usf, he lives aro   0
5 FreeMsg Hey there darling it's been 3 week's n   1
6 WINNER!! As a valued network customer you have   1

1 个答案:

答案 0 :(得分:3)

您的CountVectorizer已经配备了培训数据。因此,对于您的测试数据,您只需要致电transform(),而不是fit_transform()

否则,如果再次对测试数据使用fit_transform(),则会根据测试数据的唯一词汇获得不同的列。所以只适合一次训练。

X_testcv = cv.transform(X_test)