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

Using Naive Bayes for spam detection

我有两个电子邮件文件,一些是垃圾邮件,一些是垃圾邮件,我正在尝试使用朴素贝叶斯训练分类器,然后在测试集上对其进行测试,我仍在尝试弄清楚如何这样做

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

要解决此问题,请不要第二次使用适合变换,因此替换:

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

与:

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

重要的是从你的训练数据而不是你的所有数据中制作你的矢量化器,这很容易避免丢失特征。这使您的测试更加准确,因为在真正使用模型时它会遇到未知单词。

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