使用朴素贝叶斯进行垃圾邮件检测
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)
重要的是从你的训练数据而不是你的所有数据中制作你的矢量化器,这很容易避免丢失特征。这使您的测试更加准确,因为在真正使用模型时它会遇到未知单词。
这不能保证您的方法会奏效,但这可能是维度问题的根源。
我有两个电子邮件文件,一些是垃圾邮件,一些是垃圾邮件,我正在尝试使用朴素贝叶斯训练分类器,然后在测试集上对其进行测试,我仍在尝试弄清楚如何这样做
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)
重要的是从你的训练数据而不是你的所有数据中制作你的矢量化器,这很容易避免丢失特征。这使您的测试更加准确,因为在真正使用模型时它会遇到未知单词。
这不能保证您的方法会奏效,但这可能是维度问题的根源。