Проверьте навыки классификатора в scikit learn - PullRequest
0 голосов
/ 14 октября 2019

После обучения классификатора я попытался пропустить несколько предложений, чтобы проверить, правильно ли он его классифицирует.

Во время этого тестирования результаты выглядят не очень хорошо.

Полагаю, некоторые переменные неверны.

Пояснение

У меня есть фрейм данных с именем df, который выглядит следующим образом:

                                              news        type
0   From: mathew <mathew@mantis.co.uk>\n Subject: ...   alt.atheism
1   From: mathew <mathew@mantis.co.uk>\n Subject: ...   alt.space
2   From: I3150101@dbstu1.rz.tu-bs.de (Benedikt Ro...   alt.tech
                                                            ...
#each row in the news column is a document
#each row in the type column is the category of that document

Предварительная обработка:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
from sklearn import metrics

vectorizer = TfidfVectorizer( stop_words = 'english')

vectors = vectorizer.fit_transform(df.news)
clf =  SVC(C=10,gamma=1,kernel='rbf')

clf.fit(vectors, df.type)
vectors_test = vectorizer.transform(df_test.news)
pred = clf.predict(vectors_test)

Попытка проверить, как классифицируются некоторые предложения

texts = ["The space shuttle is made in 2018", 
         "stars are shining",
         "galaxy"]
text_features = vectorizer.transform(texts)
predictions = clf.predict(text_features)
for text, predicted in zip(texts, predictions):
   print('"{}"'.format(text))
   print("  - Predicted as: '{}'".format(df.type[pred]))

   print("")

Проблема в том, что он возвращает это:

"The space shuttle is made in 2018"
  - Predicted as: 'alt.atheism    NaN
alt.atheism    NaN
alt.atheism    NaN
alt.atheism    NaN
alt.atheism    NaN

Что вы думаете?

РЕДАКТИРОВАТЬ

Пример

Этовроде как должно выглядеть:

>>> docs_new = ['God is love', 'OpenGL on the GPU is fast']
>>> 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, twenty_train.target_names[category]))
...
'God is love' => soc.religion.christian
'OpenGL on the GPU is fast' => comp.graphics

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Данные, с которыми вы обучаете свой классификатор, значительно отличаются от фраз, на которых вы его проверяете. Как вы упомянули в своем комментарии к моему первому ответу, вы получаете точность более 90%, что довольно хорошо. Но вы попытались классифицировать элементы списка рассылки, которые представляют собой длинные документы с адресами электронной почты. Ваши фразы, такие как «Спейс шаттл сделан в 2018 году», довольно короткие и не содержат адресов электронной почты. Вполне возможно, что ваш классификатор использует эти адреса электронной почты для классификации документов, что объясняет хорошие результаты. Вы можете проверить, действительно ли это так, если вы удалите адреса электронной почты из данных перед тренировкой.

0 голосов
/ 14 октября 2019

Как вы упомянули в комментариях, у вас есть около 700 образцов. Чтобы проверить, насколько хорошо работает ваш классификатор, вы всегда должны разбивать свои данные на обучающие и тестовые образцы. Например, 500 образцов в качестве обучающих данных и 200 для проверки вашего классификатора. Затем вы должны использовать только свои тренировочные образцы для обучения и свои тестовые образцы для тестирования. Тестовые данные, созданные вручную, как и вы, не обязательно имеют смысл. Sklearn поставляется с удобной функцией для разделения данных на тестирование и обучение:

#separate training and test data, 20% og your data is selected as test data
from sklearn.model_selection import train_test_split
df_train, df_test = train_test_split(df, test_size=0.2)

vectors = vectorizer.fit_transform(df_train.news)
clf =  SVC(C=10,gamma=1,kernel='rbf')
#train classifier
clf.fit(vectors, df_train.type)

#test classifier on the test set
vectors_test = vectorizer.transform(df_test.news)
pred = clf.predict(vectors_test)
#prints accuracy of your classifier
from sklearn.metrics import classification_report
classification_report(df_test.type, pred)

Это даст вам подсказку, насколько хорош ваш классификатор на самом деле. Если вы считаете, что он недостаточно хорош, попробуйте другой классификатор, например логистическая регрессия . Или вы можете изменить свои данные на все строчные буквы и посмотреть, поможет ли это повысить вашу точность.

Редактировать: Вы также можете записать свои прогнозы обратно в свой test_datframe:

df_test['Predicted'] = preds
df_test.head()

Это поможет вам увидеть шаблон. Действительно ли все предсказывается как alt.atheism, как показывает ваш пример?

...