Python 使用朴素贝叶斯进行垃圾邮件检测

Python 使用朴素贝叶斯进行垃圾邮件检测,python,numpy,machine-learning,scikit-learn,naivebayes,Python,Numpy,Machine Learning,Scikit Learn,Naivebayes,我有两个电子邮件文件,一个是垃圾邮件,另一个是火腿,我正在尝试使用朴素贝叶斯训练分类器,然后在测试集上测试它,我仍在试图找出如何做到这一点 df = DataFrame() train=data.sample(frac=0.8,random_state=20) test=data.drop(train.index) vectorizer = CountVectorizer() counts = vectorizer.fit_transform(train['message'].values)

我有两个电子邮件文件,一个是垃圾邮件,另一个是火腿,我正在尝试使用朴素贝叶斯训练分类器,然后在测试集上测试它,我仍在试图找出如何做到这一点

df = DataFrame()
train=data.sample(frac=0.8,random_state=20)
test=data.drop(train.index)
vectorizer = CountVectorizer()

counts = vectorizer.fit_transform(train['message'].values)
classifier = MultinomialNB()
targets = train['class'].values
classifier.fit(counts, targets)

testing_set = vectorizer.fit_transform(test['message'].values)
predictions = classifier.predict(testing_set)
我认为这样做是不对的,除此之外,最后一行给了我一个错误

ValueError: dimension mismatch

CountVectorizer
背后的思想是,它创建一个函数,将字数映射到数组中相同的位置。例如:
abaac
可能变成
[2,1,1]
。调用
fit\u transform
时,它会创建索引映射
A->0,B->1,C->2
,然后应用该映射来创建计数向量。在这里,您可以调用
fit\u transform
为您的训练创建一个计数矢量器,然后再次为您的测试集创建一个计数矢量器。有些词可能出现在测试数据中,而不是训练数据中,这些词会被添加。要扩展前面的示例,您的测试集可能是
dab
,它将创建一个维度为4的向量来解释
d
。这可能就是尺寸不匹配的原因

若要解决此问题,请不要第二次使用拟合变换,以便替换:

vectorizer.fit_transform(test['message'].values)
与:

让你的训练数据而不是所有的数据成为向量是很重要的,这很容易避免遗漏特征。这使您的测试更加准确,因为当真正使用模型时,它将遇到未知单词


这并不能保证你的方法会起作用,但这可能是维度问题的根源。

你的答案很清楚,非常感谢,它确实解决了维度问题,但现在我遇到了这个错误:TypeError:float()参数必须是字符串或数字,而不是“CountVectorizer”,糟糕!应该只是
transform
而不仅仅是
fit
让我编辑没关系,谢谢你救了我一天!现在可以了。
vectorizer.transform(test['message'].values)