使用Naive Bayes进行垃圾邮件检测

时间:2018-02-18 21:26:38

标签: python numpy machine-learning scikit-learn naivebayes

我有两个电子邮件文件,有些是垃圾邮件,有些是火腿,我试图使用Naive Bayes训练分类器,然后在测试集上测试它,我还在试图计算如何做到这一点

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

1 个答案:

答案 0 :(得分:1)

CountVectorizer背后的想法是它创建了一个将单词计数映射到数组中相同位置的函数。例如:a b a c可能会成为[2, 1, 1]。当您调用fit_transform时,它会创建索引映射A -> 0, B-> 1, C -> 2,然后应用它来创建计数向量。在这里,您可以致电fit_transform为您的培训创建一个计数矢量化器,然后再为您的测试集创建一个计数矢量化器。您的测试数据中可能包含一些单词,而不是您的培训数据,这些单词可能会被添加要扩展前面的示例示例,您的测试集可能是d a b,它会创建一个维度为4的向量来计算d。这可能是尺寸不匹配的原因。

要解决此问题,请不要在第二次使用fit变换,因此请更换:

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

使用:

vectorizer.transform(test['message'].values)

让您的矢量控制器从您的训练数据中获取并非所有数据都很重要,因为这样可以避免丢失特征。这使得您的测试更加准确,因为在真正使用模型时会遇到未知单词。

这并不能保证您的方法可行,但这可能是维度问题的根源。