Как получить N лучших прогнозов, используя SGDClassifier от sklearn - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь настроить простую задачу классификации текста с помощью SGDClassifier scikit и пытаюсь вернуть N лучших прогнозов, включая их вероятности.В качестве примера учебных данных у меня есть три класса

  • яблоки
  • лимоны
  • апельсины

с одним документом на класс:

  • в яблоках: «яблоко и лимон»
  • в лимонах: «лимон и апельсин»
  • в апельсинах: «апельсин и яблоко»

Теперь я хочу предсказать три тестовых документа: «яблоко», «лимон» и «апельсин» и хотел бы получить топ-2-прогнозы на документ, включая их вероятность.Пока мой код выглядит так:

from sklearn.linear_model import SGDClassifier
from sklearn.datasets import load_files
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.pipeline import Pipeline
import numpy as np

train = load_files('data/test/')

text_clf_svm = Pipeline([('vect', CountVectorizer()), ('tfidf', TfidfTransformer()),
                     ('clf-svm', SGDClassifier(loss='modified_huber', penalty='l2',alpha=1e-3, n_iter=5, random_state=42))])
text_clf_svm = text_clf_svm.fit(train.data, train.target)

docs=['apple', 'orange', 'lemon']
predicted = text_clf_svm.predict(docs)
#Perform a Top 1 prediction
for doc, category in zip(docs, predicted):
    print('%r => %s' % (doc, train.target_names[category]))

# Perform a top 2 prediction
print(np.argsort(text_clf_svm.predict_proba(docs), axis=1)[-2:])

Мой вывод выглядит следующим образом:

'apple' => apples
'orange' => lemons
'lemon' => lemons
[[1 2 0]
[0 1 2]]

Теперь у меня возникают трудности с интерпретацией данных.На самом деле я хочу получить:

'apple' => apples (0.54...), lemons (0.43...)
'orange' => apples (0.48...), oranges (0.43...)
'lemon' => lemons (0.48...), oranges (0.43...)

Может кто-нибудь сказать мне, как я могу это сделать?Заранее благодарю за помощь!

Ответы [ 2 ]

0 голосов
/ 30 марта 2019

быстрое добавление к ответу @ Imtinan, так как этот ответ упорядочивает ваши метки как 2-й самый высокий, а затем 1-й самый высокий вероятный (возрастающий порядок).Если вместо этого вы хотите, чтобы это происходило в порядке убывания, просто измените:

preds_idx = np.argsort(-preds, axis = 1)[ :2]

0 голосов
/ 08 октября 2018

Вы используете argsort, что делает argsort так, что он дает вам индексы отсортированного массива, поэтому вы должны сделать следующее:

preds = text_clf_svm.predict_proba(docs)
preds_idx = np.argsort(preds, axis=1)[-2:]

for i,d in enumerate(docs):
    print d,"=>"
    for p in preds_idx[i]:
        print(text_clf_svm.classes_[p],"(",preds[i][p],")")

просто переформатируйте печать в соответствии со своим стилем, и выбудет иметь то, что вы хотите:)

...