Как заставить работать наивный байесовский классификатор? - PullRequest
0 голосов
/ 09 сентября 2018

Я пытался использовать наивный байесовский классификатор для классификации моего образца корпуса. Пример корпуса выглядит следующим образом (хранится в 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'

Куда я иду не так?

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

, если вы хотите иметь доступ к столбцу панд с помощью data['label'], Ваша первая строка должна быть:

Text;label

не это:

"Text";"label"

таким образом, вы должны индексировать ваш ярлык col следующим образом;

data['"label"']

что выглядит не очень хорошо

0 голосов
/ 09 сентября 2018

Если есть сомнения, загрузите ваш код в 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"'].

0 голосов
/ 09 сентября 2018

похоже, что ваши данные имеют кавычки, почему вы указали здесь QUOTE_NONE?

...