【问题标题】:Using Naive Bayes for spam detection使用朴素贝叶斯进行垃圾邮件检测
【发布时间】:2018-07-29 03:11:54
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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)
    

    重要的是让您的训练数据而非所有数据都变得矢量化,这很容易避免丢失特征。这使您的测试更加准确,因为在真正使用模型时会遇到未知单词。

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

    【讨论】:

    • 您的回答很清楚,非常感谢,它确实解决了维度问题,但现在我收到此错误:TypeError: float() argument must be a string or a number, not ' CountVectorizer'
    • 哎呀我的坏!应该只是 transform 而不仅仅是 fit 让我编辑
    • 没关系,非常感谢你拯救了我的一天!现在可以使用了。
    猜你喜欢
    • 2014-05-08
    • 2010-09-26
    • 2011-02-06
    • 2019-07-21
    • 2011-09-21
    • 2016-08-16
    • 2011-02-16
    • 2016-07-29
    相关资源
    最近更新 更多