Как получить прогнозируемую вероятность в машинном наклонении - PullRequest
0 голосов
/ 09 июля 2020

У меня есть эта ML модель, обученная и выгруженная, так что я могу использовать ее где угодно. И мне нужно получить не только значения score, predict, но также мне нужно значение predict_proba.

Я мог бы получить это, но проблема в том, что я ожидал, что вероятности будут между 0 и 1, но я получаю что-то другое, как показано ниже.

array([[1.00000000e+00, 2.46920929e-12],
       [1.00000000e+00, 9.89834607e-11],
       [9.99993281e-01, 6.71853451e-06],
       ...,
       [1.22327143e-01, 8.77672857e-01],
       [9.99999653e-01, 3.47049875e-07],
       [1.00000000e+00, 3.79462343e-10]])

И это код python, который я использую.


%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import pickle
from sklearn.model_selection import train_test_split

from sklearn.preprocessing import LabelEncoder


# dataframe = pd.read_csv("hr_dataset.csv")
dataframe = pd.read_csv("formodel.csv")

dataframe.head(2)

# spare input and target variables
inputs = dataframe.drop('PerformanceRating', axis='columns')

target = dataframe['PerformanceRating']

MaritalStatus_ = LabelEncoder()
JobRole_ = LabelEncoder()
Gender_ = LabelEncoder()
EducationField_ = LabelEncoder()
Department_ = LabelEncoder()
BusinessTravel_ = LabelEncoder()
Attrition_ = LabelEncoder()
OverTime_ = LabelEncoder()
Over18_ = LabelEncoder()

inputs['MaritalStatus_'] = MaritalStatus_.fit_transform(inputs['MaritalStatus'])
inputs['JobRole_'] = JobRole_.fit_transform(inputs['JobRole'])
inputs['Gender_'] = Gender_.fit_transform(inputs['Gender'])
inputs['EducationField_'] = EducationField_.fit_transform(inputs['EducationField'])
inputs['Department_'] = Department_.fit_transform(inputs['Department'])
inputs['BusinessTravel_'] = BusinessTravel_.fit_transform(inputs['BusinessTravel'])
inputs['Attrition_'] = Attrition_.fit_transform(inputs['Attrition'])
inputs['OverTime_'] = OverTime_.fit_transform(inputs['OverTime'])
inputs['Over18_'] = Over18_.fit_transform(inputs['Over18'])


inputs.drop(['MaritalStatus', 'JobRole', 'Attrition' , 'OverTime' , 'EmployeeCount', 'EmployeeNumber',
                'Gender', 'EducationField', 'Department', 'BusinessTravel', 'Over18'], axis='columns', inplace=True)


inputsNew = inputs
inputs.head(2)


# inputs = scaled_df
X_train, X_testt, y_train, y_testt = train_test_split(inputs, target, test_size=0.2)



loaded_model = pickle.load(open(filename, 'rb'))
result = loaded_model.score(X_testt, y_testt)
print(result)
loaded_model.predict_proba(inputs) // this produces above result, will put it below as well

outpu производит loaded_model.predict_proba(inputs)

array([[1.00000000e+00, 2.46920929e-12],
       [1.00000000e+00, 9.89834607e-11],
       [9.99993281e-01, 6.71853451e-06],
       ...,
       [1.22327143e-01, 8.77672857e-01],
       [9.99999653e-01, 3.47049875e-07],
       [1.00000000e+00, 3.79462343e-10]])

Как я могу преобразовать эти значения или получить результат в виде процентов? (eg: 12%, 50%, 96%)

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

loaded_model.predict_proba(inputs) выводит вероятность 1-го класса, а также 2-го класса (так как у вас 2 класса). Вот почему вы видите 2 выхода для каждого вхождения данных. Общая вероятность для каждого случая составляет до 1.

Допустим, если вас интересует вероятность второго класса, вы можете использовать следующую строку для получения вероятности второго класса.

loaded_model.predict_proba(inputs)[:,1]

Я не уверен, что это то, что вы ищете, извиняюсь, если я неправильно понял ваш вопрос.

0 голосов
/ 09 июля 2020

Чтобы преобразовать массив вероятностей из десятичного числа в процентное, вы можете написать (loaded_model.predict_proba(inputs)) * 100.

РЕДАКТИРОВАТЬ : Формат, выводимый loaded_model.predict_proba(inputs), является просто научным c обозначением , т.е. все эти числа находятся в диапазоне от 0 до 1, но многие из них являются чрезвычайно малыми вероятностями и поэтому представлены в научной c нотации.

Причина, по которой вы видите такие маленькие вероятностей состоит в том, что loaded_model.predict_proba(inputs)[:,0] (первый столбец массива вероятностей) представляет вероятности данных, принадлежащих одному классу, а loaded_model.predict_proba(inputs)[:,1] представляет вероятности данных, принадлежащих другому классу.

В другом словами, это означает, что каждая строка массива вероятностей должна составлять в сумме 1.

Надеюсь, это поможет!

...