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

Python 如何让朴素贝叶斯分类器工作?,python,scikit-learn,classification,naivebayes,Python,Scikit Learn,Classification,Naivebayes,我尝试使用朴素贝叶斯分类器对样本语料库进行分类。样本语料库如下(存储在myfile.csv中): 分类器的代码如下所示: # 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

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

分类器的代码如下所示:

# 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'

我哪里出错了?

看起来您的数据有引号,为什么在那里没有指定引号?

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

Text;label
不是这个:

"Text";"label"
这样,您必须像这样索引标签列

data['"label"']

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

import pandas as pd
import csv
...

data = pd.read_csv(open('myfile.csv'), sep=';', quoting=csv.QUOTE_NONE)
import pdb; pdb.set_trace()
...
现在我们可以交互式地查询
数据
对象:

(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”
。因此,您不能执行
数据[“标签”]
,否则您将看到
键错误。您必须说
数据[''label']

这可能是正确的答案-使用
标签“
或打开引号可能会有所帮助。如果你能说如何正确地做,这个答案会更有帮助(否则这只是一个评论)。例如,通过引用不带引号的“无”,我不断得到错误:pandas.errors.ParserError:error标记化数据。C错误:从第1行开始的字符串中的EOF我想您是指
X\u列计数=计数向量.拟合变换(数据['Text'])
而不是
X\u列计数=计数向量.拟合变换(数据)
?我在此更改下运行了您的代码,没有
quoting=csv.QUOTE_NONE
,我没有收到任何错误,事实上,我得到了
label1
用于
“没有脊椎骨炎”
label2
用于
“有大量液体收集”
我在试图重现您的错误时手动创建了您的样本数据框,这就是为什么我没有包括
quoting=csv.QUOTE\u NONE
部分。如果没有QUOTE\u NONE,我会不断得到错误:pandas.errors.ParserError:error标记化数据。C错误:从第1行开始的字符串中的EOF
data.columns.values的输出是什么?
?我认为从.csv文件中删除所有引号并删除quoting=csv.QUOTE_NONE,程序就可以运行了。但它仍然给了我错误的答案。你是如何得到正确的标签的?
(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'