Прогнозируемый класс вместе с соответствующей вероятностью

Я построил модель машинного обучения с использованием классификатора maxvoting (дерево решений, случайный лес, логистическая регрессия). Для чего у меня есть вход как

{"Заработная плата": 50000, "Текущие займы": 15000, "Кредитный рейтинг": 616, "Запрошенный заем": 25000}

Когда я передаю эти данные своей модели. Это дает прогноз как

{"Статус": одобрить}

Но мне нужно получить ответ, например

{"Статус": одобрить, "Точность": 0,87}

Любая помощь приветствуется


person syed jameer    schedule 10.05.2020    source источник
comment
Возможно, вы хотите взглянуть на predict_proba?   -  person Jake Tae    schedule 10.05.2020


Ответы (1)


Похоже, вы, вероятно, используете VotingClassifier sklearn. . После того, как вы установили классификатор, вы увидите вероятности, связанные с каждым классом, с помощью атрибута _ 2_. Обратите внимание, что это не точность, а связанная вероятность каждого класса. Поэтому, если вы хотите, чтобы вероятность того, что тестовая выборка относится к классу n, вам придется проиндексировать результат y_pred_prob в соответствующем столбце. Вот пример использования набора данных iris от sklearn:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier, VotingClassifier

from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB

clf1 = LogisticRegression(multi_class='multinomial', random_state=1)
clf2 = RandomForestClassifier(n_estimators=50, random_state=1)
clf3 = GaussianNB()

X, y = load_iris(return_X_y=True)

X_train, X_test, y_train, y_test = train_test_split(X, y)

eclf2 = VotingClassifier(estimators=[
        ('lr', clf1), ('rf', clf2), ('gnb', clf3)],
        voting='soft')

eclf2 = eclf2.fit(X_train, y_train)

И мы могли бы получить вероятности, связанные с первым классом, например, с помощью:

eclf2.predict_proba(X_test)[:,0].round(2)

array([0.99, 0.  , 0.  , 0.  , 0.  , 0.  , 0.01, 0.01, 0.  , 0.  , 0.  ,
       0.99, 0.  , 0.99, 0.99, 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ,
       0.  , 0.01, 0.98, 0.  , 1.  , 0.99, 0.  , 0.  , 0.  , 0.99, 0.98,
       0.  , 0.99, 0.  , 0.01, 0.99])

Наконец, чтобы получить результат, как вы описали, вы можете использовать результат, возвращаемый predict, для индексации двумерного массива вероятностей следующим образом:

import pandas as pd

y_pred = eclf2.predict(X_test)
y_pred_prob = eclf2.predict_proba(X_test).round(2)
associated_prob = y_pred_prob[np.arange(len(y_test)), y_pred]
pd.DataFrame({'class':y_pred, 'Accuracy':associated_prob})

    class  Accuracy
0       0      0.99
1       2      0.84
2       2      1.00
3       1      0.95
4       2      0.99
5       2      0.91
6       1      0.98
7       1      0.98
8       1      0.93

Или, если вы предпочитаете вывод в виде словаря:

pd.DataFrame({'class':y_pred, 'Accuracy':associated_prob}).to_dict(orient='index')

 {0: {'class': 0, 'Accuracy': 0.99},
  1: {'class': 2, 'Accuracy': 0.84},
  2: {'class': 2, 'Accuracy': 1.0},
  3: {'class': 1, 'Accuracy': 0.95},
  4: {'class': 2, 'Accuracy': 0.99},
person yatu    schedule 10.05.2020
comment
Я пробовал тот же exaple, который вы предоставили. но выдает ошибку при импорте pandas y_pred = eclf2.predict (X_test) associated_prob = y_pred_prob [np.arange (len (y_test)), y_pred] pd.DataFrame ({'class': y_pred, 'Accuracy': associated_prob}) - person syed jameer; 10.05.2020
comment
Попробуйте сейчас, посмотрите, работает ли это @syedjameer Мне не хватало определения y_pred_prob - person yatu; 10.05.2020
comment
Это помогло @syed? Не забывайте, что вы можете голосовать и принимать ответы. См. Что мне делать, когда кто-то отвечает на мой вопрос?, спасибо! - person yatu; 10.05.2020
comment
Спасибо, помогите мне @yatu - person syed jameer; 10.05.2020
comment
Уважаемый @yatu, Я пытаюсь реализовать тот же сценарий, используя дерево решений. Столкнувшись с той же проблемой. Не могли ли вы помочь мне, пожалуйста. Как получить значение точности при использовании дерева решений. Было бы полезнее - person syed jameer; 31.05.2020