Я попытался использовать наивный байесовский классификатор для классификации своего корпуса образцов. Примерный корпус выглядит следующим образом (хранится в 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'
Где я ошибаюсь?
Я вручную создал ваш образец фрейма данных, когда пытался воспроизвести вашу ошибку, кстати, поэтому я не включил часть quoting=csv.QUOTE_NONE
.
Без QUOTE_NONE я продолжаю получать ошибку: pandas.errors.ParserError: Ошибка токенизации данных. Ошибка C: EOF внутри строки, начиная со строки 1
Что на выходе data.columns.values
?
Я подумал, что удаление всех кавычек из файла .csv и удаление quoting = csv.QUOTE_NONE, программа работает. Но это все равно дает мне неправильный ответ. Как вы получили правильный лейбл?
Я ничего не делал, я просто запустил ваш код с изменением, о котором упоминал ранее. Я обучил данные, используя образцы данных, предоставленные вами, поэтому я предполагаю, что у вас есть больше данных. Наверное, поэтому мы получаем разные результаты
Нет, на самом деле у меня больше нет данных! Вот и все! Вносили ли вы какие-нибудь другие изменения? Я все время получаю: «спондилодисцита нет» => 0 label1 и «есть большой сбор жидкости» => 0 label1
Я не запускал следующие строки #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)
, потому что вы, кажется, не используете их где-либо еще
Вы не используете X_train_tf
где-либо еще, вместо этого вы используете X_train_tfidf
во время установки.
Я так и сделал, но все равно получил тот же неправильный ответ. Не могли бы вы опубликовать свой полный код и ответ в разделе «Отправьте ответ» ниже?
Вместо этого запустите predicted
. Это правильный результат
Вместо этого запустите это: for doc, category in zip(docs_new, predicted): print('%r => %s' % (doc, category))
. Вы написали data['label']
, и вместо этого должно быть написано category
. На выходе получается 'there is no spondylodiscitis' => label1 'there is a large fluid collection' => label2
.
похоже, что в ваших данных есть кавычки, почему вы указали здесь QUOTE_NONE?
Вероятно, это правильный ответ - возможно, поможет использование "label"
или включение кавычек. Этот ответ был бы более полезным, если бы вы сказали, как это сделать правильно (иначе это скорее комментарий). Например. цитируя документация
Без QUOTE_NONE я продолжаю получать ошибку: pandas.errors.ParserError: Ошибка токенизации данных. Ошибка C: EOF внутри строки, начиная со строки 1
если вы хотите иметь доступ к столбцу pandas с помощью data['label']
,
ваша первая строка должна быть:
Text;label
не этот :
"Text";"label"
таким образом вы должны проиндексировать свой ярлык col следующим образом;
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()
...
Теперь мы можем запросить объект 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"']
.
Я думаю, вы имеете в виду
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'