Как получить вероятности вместе с классификацией в LogisticRegression? - PullRequest
0 голосов
/ 19 июня 2020

Я использую алгоритм регрессии Logisti c для классификации текста по нескольким классам. Мне нужен способ получить оценку уверенности вместе с категорией. Например, если я передаю в модель text = "Hello, this is sample text", я должен получить прогнозируемый класс = Class A и достоверность = 80% в результате.

1 Ответ

1 голос
/ 19 июня 2020

Для большинства моделей в scikit-learn мы можем получить оценки вероятности для классов через predict_proba. Имейте в виду, что это фактический результат функции logisti c, итоговая классификация получается путем выбора выхода с наибольшей вероятностью, т. Е. К выходу применяется argmax. Если мы увидим реализацию здесь , вы увидите, что она, по сути, выполняет:

def predict(self, X):
    # decision func on input array
    scores = self.decision_function(X)
    # column indices of max values per row
    indices = scores.argmax(axis=1)
    # index class array using indices
    return self.classes_[indices]

В случае вызова predict_proba, а не predict, возвращается scores . Вот пример использования тренировки a LogisticRegression:

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y)

lr= LogisticRegression()
lr.fit(X_train, y_train)
y_pred_prob = lr.predict_proba(X_test)

y_pred_prob
array([[1.06906558e-02, 9.02308167e-01, 8.70011771e-02],
       [2.57953117e-06, 7.88832490e-03, 9.92109096e-01],
       [2.66690975e-05, 6.73454730e-02, 9.32627858e-01],
       [9.88612145e-01, 1.13878133e-02, 4.12714660e-08],
       ...

И мы можем получить вероятности, взяв argmax, как упоминалось, и проиндексируя массив классов как:

classes = load_iris().target_names
classes[indices]
array(['virginica', 'virginica', 'versicolor', 'virginica', 'setosa',
       'versicolor', 'versicolor', 'setosa', 'virginica', 'setosa',...

Итак, для единственного прогноза, используя предсказанные вероятности, мы можем легко сделать что-то вроде:

y_pred_prob = lr.predict_proba(X_test[0,None])
ix = y_pred_prob.argmax(1).item()

print(f'predicted class = {classes[ix]} and confidence = {y_pred_prob[0,ix]:.2%}')
# predicted class = virginica and confidence = 90.75%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...