无法在朴素贝叶斯中训练模型

Posted

技术标签:

【中文标题】无法在朴素贝叶斯中训练模型【英文标题】:Unable to train model in Naive Bayes 【发布时间】:2019-04-07 11:33:48 【问题描述】:

我正在尝试使用 NLTK 将电子邮件分类为垃圾邮件/火腿

以下是遵循的步骤:

    尝试提取所有标记

    获取所有特征

    从所有唯一词的语料库中提取特征并进行映射 真/假

    在朴素贝叶斯分类器中训练数据

from nltk.classify.util import apply_features
from nltk import NaiveBayesClassifier
import pandas as pd
import collections
from sklearn.model_selection import train_test_split
from collections import Counter
data = pd.read_csv('https://raw.githubusercontent.com/venkat1017/Data/master/emails.csv')

"""fetch array of tuples where each tuple is defined by (tokenized_text, label)
"""

processed_tokens=data['text'].apply(lambda x:([x for x in x.split() if x.isalpha()]))
processed_tokens=processed_tokens.apply(lambda x:([x for x in x if len(x)>3]))

processed_tokens = [(i,j) for i,j in zip(processed_tokens,data['spam'])]



"""
 dictword return a Set of unique words in complete corpus.
"""

list = zip(*processed_tokens)

dictionary = Counter(word for i, j in processed_tokens for word in i)

dictword = [word for word, count in dictionary.items() if count == 1]


"""maps each input text into feature vector"""

y_dict = ( [ (word, True) for word in dictword] )
feature_vec=dict(y_dict)

"""Training"""

training_set, testing_set = train_test_split(y_dict, train_size=0.7)

classifier = NaiveBayesClassifier.train(training_set)

    ~\AppData\Local\Continuum\anaconda3\lib\site-packages\nltk\classify\naivebayes.py in train(cls, labeled_featuresets, estimator)
    197         for featureset, label in labeled_featuresets:
    198             label_freqdist[label] += 1
--> 199             for fname, fval in featureset.items():
    200                 # Increment freq(fval|label, fname)
    201                 feature_freqdist[label, fname][fval] += 1

AttributeError: 'str' object has no attribute 'items'

我在尝试训练唯一词的语料库时遇到以下错误

【问题讨论】:

【参考方案1】:

首先,我希望您知道y_dict 只是一个字典,它将语料库中仅出现一次的单词(字符串)映射为值True 的键。您将它作为训练集传递给分类器,而您应该传递 tuple 的(每个文本行的特征字典)和(相应的标签)。虽然您的分类器应该接收[('feat1': 'value1', ... , label_value), ...] 作为输入,但您传递的是[ ('word1', True), ... ]string 类型没有 items 属性,只有 dict 有。因此出现错误。

其次,您的数据建模错误。您的训练集应包含从 data['text'] 派生的特征字典,映射到 data['spam'] 值(因为那是您的标签)。请在第 1.3 节here 中查看如何使用 nltk 的分类器执行文档分类。

【讨论】:

以上是关于无法在朴素贝叶斯中训练模型的主要内容,如果未能解决你的问题,请参考以下文章

在朴素贝叶斯中的概率估计中的 m 应该被视为啥

如何在高斯朴素贝叶斯中获得特征重要性

机器学习面试题——朴素贝叶斯

朴素贝叶斯:基于概率论的分类模型

朴素贝叶斯

多项朴素贝叶斯中 coef_ 和 feature_log_prob_ 的区别?