CountVectorizer MultinomialNB 中的尺寸不匹配错误

Posted

技术标签:

【中文标题】CountVectorizer MultinomialNB 中的尺寸不匹配错误【英文标题】:dimension mismatch error in CountVectorizer MultinomialNB 【发布时间】:2018-01-29 22:38:06 【问题描述】:

在我提出这个问题之前,我不得不说我已经彻底阅读了这个板上超过 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 个小时后,我不得不屈服于 ***。如果有人能就此启发我,将不胜感激。只是想知道我的代码出了什么问题以及如何正确设置维度。

谢谢。

顺便说一句,原始数据条目是这样的

_

                                         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】:

您的CountVectorizer 已经安装了训练数据。所以对于你的测试数据,你只想调用transform(),而不是fit_transform()

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

X_testcv = cv.transform(X_test)

【讨论】:

谢谢,它终于奏效了,非常感谢您向我解释 .fit_transform 和 .transform 之间的区别。我以前试过这个,但当时它给我带来了错误消息。

以上是关于CountVectorizer MultinomialNB 中的尺寸不匹配错误的主要内容,如果未能解决你的问题,请参考以下文章

Spark CountVectorizer

sklearn CountVectorizer

Spark 机器学习 ---CountVectorizer

sklearn中CountVectorizer与TfidfVectorizer区别

CountVectorizer 删除只出现一次的特征

来自 CountVectorizer 的术语相对频率矩阵