如何让朴素贝叶斯分类器工作?

Posted

技术标签:

【中文标题】如何让朴素贝叶斯分类器工作?【英文标题】:How to get naive Bayes classifier to work? 【发布时间】:2019-02-14 03:42:09 【问题描述】:

我尝试使用朴素贝叶斯分类器对我的样本语料库进行分类。样本语料如下(存储在myfile.csv中):

"Text";"label"
“There be no significant perinephric collection";"label1”
“There be also fluid collection”;”label2”
“No discrete epidural collection or abscess be see";"label1”
“This be highly suggestive of epidural abscess”;”label2”
“No feature of spondylodiscitis be see”;”label1”
“At the level of l2 l3 there be loculated epidural fluid collection”;”label2”

分类器代码如下:

# libraries for dataset preparation, feature engineering, model training 
import pandas as pd
import csv
from sklearn import svm
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB

#Data preparation
data = pd.read_csv(open('myfile.csv'), sep=';', quoting=csv.QUOTE_NONE)

# Creating Bag of Words
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(data)
print(X_train_counts.shape)

#From occurrences to frequencies
tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts)
X_train_tf = tf_transformer.transform(X_train_counts)
print(X_train_tf.shape)

tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
print(X_train_tfidf.shape)

#Training a classifier
clf = MultinomialNB().fit(X_train_tfidf, data['label'])

#Predicting with the classifier
docs_new = ['there is no spondylodiscitis', 'there is a large fluid collection']
X_new_counts = count_vect.transform(docs_new)
X_new_tfidf = tfidf_transformer.transform(X_new_counts)
predicted = clf.predict(X_new_tfidf)
for doc, category in zip(docs_new, predicted): 
    print('%r => %s' % (doc, data['label']))

每当我尝试运行预测时,都会收到以下错误:

KeyError: 'label'

我哪里错了?

【问题讨论】:

我想你的意思是X_train_counts = count_vect.fit_transform(data['Text']) 而不是X_train_counts = count_vect.fit_transform(data)?我在此更改下运行了您的代码并且没有quoting=csv.QUOTE_NONE 并且我没有收到任何错误,实际上我得到label1 用于'there is no spondylodiscitis'label2 用于'there is a large fluid collection' 当我试图重现您的错误时,我手动创建了您的示例数据框,这就是为什么我没有包含 quoting=csv.QUOTE_NONE 部分。 没有 QUOTE_NONE 我不断收到错误消息:pandas.errors.ParserError: Error tokenizing data。 C 错误:字符串中的 EOF 从第 1 行开始 data.columns.values 的输出是什么? 我认为从 .csv 文件中删除所有引号并删除 quoting=csv.QUOTE_NONE,程序可以工作。但它仍然给了我错误的答案。您是如何获得正确标签的? 【参考方案1】:

看起来你的数据有引号,为什么你在那里指定了 QUOTE_NONE?

【讨论】:

这可能是正确的答案 - 使用 "label" 代替或打开引号可能会有所帮助。如果你说如何正确地做这个答案会更有帮助(否则它是一个评论)。例如。通过引用documentation 没有 QUOTE_NONE 我不断收到错误消息:pandas.errors.ParserError: Error tokenizing data。 C 错误:字符串中的 EOF 从第 1 行开始【参考方案2】:

如果您希望能够使用 data['label'] 访问 pandas 列, 你的第一行应该是:

Text;label

不是这个:

"Text";"label"

这样你必须像这样索引你的标签 col ;

data['"label"']

看起来不太好

【讨论】:

【参考方案3】:

如有疑问,请在 REPL 或调试器中加载您的代码。观察... 中的任何内容与您的问题无关。

import pandas as pd
import csv
...

data = pd.read_csv(open('myfile.csv'), sep=';', quoting=csv.QUOTE_NONE)
import pdb; pdb.set_trace()
...

现在我们可以交互式地查询data 对象:

(Pdb) data.keys()
Index(['"Text"', '"label"'], dtype='object')
(Pdb) data['"label"']
0    "label1”
1    ”label2”
2    "label1”
3    ”label2”
4    ”label1”
5    ”label2”
Name: "label", dtype: object
(Pdb) data["label"]
*** KeyError: 'label'

请注意,密钥是 '"Test"''"label"',而不是 "Test""label"。所以你不能做data["label"],否则你会得到你所看到的KeyError。你必须说data['"label"']

【讨论】:

以上是关于如何让朴素贝叶斯分类器工作?的主要内容,如果未能解决你的问题,请参考以下文章

动态朴素贝叶斯分类器和朴素贝叶斯分类器有啥区别

朴素贝叶斯分类器

机器学习系列-朴素贝叶斯分类器

使用朴素贝叶斯分类器进行意见挖掘

如何生成混淆矩阵并找到朴素贝叶斯分类器的错误分类率?

当预测变量不是二进制时,Sklearn 朴素贝叶斯伯努利分类器如何工作?