【问题标题】:How to get the predict probability in Machine Leaning如何获得机器学习中的预测概率
【发布时间】:2020-10-29 19:48:15
【问题描述】:

我已经训练并丢弃了这个 ML 模型,因此我可以在任何地方使用它。我不仅需要获取scorepredict 值,还需要获取predict_proba 值。

我可以得到,但问题是,我预计概率在 01 之间,但我得到了类似下面的其他内容。

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

输出由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%)

【问题讨论】:

    标签: python numpy machine-learning scikit-learn


    【解决方案1】:

    loaded_model.predict_proba(inputs) 输出第一类和第二类的概率(因为你有 2 个类)。这就是为什么每次出现数据都会看到 2 个输出的原因。每次出现的总概率为 1。

    假设您只关心二等舱的概率,您可以使用下面的行来获取二等舱的概率。

    loaded_model.predict_proba(inputs)[:,1]
    

    我不确定这是否是您要查找的内容,如果我误解了您的问题,我们深表歉意。

    【讨论】:

    • 在那之后为什么我得到像[1.00000000e+02, 5.55022984e-12]这样的概率输出?而且,我还没有得到关于如何使这些值看起来像 10%, 50%, 76%, 95% 等等的答案?
    • 正如@Cyber​​ 所建议的,您可以将输出乘以 100 {code: np.round(loaded_model.predict_proba(inputs)[:,1]*100,2) } 以获得百分比值最多 2 位小数。我在这里假设您关心第二类的概率。
    【解决方案2】:

    要将概率数组从小数转换为百分比,可以写(loaded_model.predict_proba(inputs)) * 100

    编辑loaded_model.predict_proba(inputs)输出的格式只是科学记数法,即所有这些数字在0到1之间,但很多都是极小概率,因此用科学计数法表示。

    你看到这么小的概率是因为loaded_model.predict_proba(inputs)[:,0](概率数组的第一列)代表数据属于一个类的概率,loaded_model.predict_proba(inputs)[:,1]代表数据属于另一个类的概率类。

    换句话说,这意味着概率数组的每一行加起来应该是 1。

    我希望这会有所帮助!

    【讨论】:

    • 是的,这就是我想要做的,但为什么我得到像[1.00000000e+02, 5.55022984e-12] 这样的概率输出?
    • 为什么它们的概率非常小,因为模型产生了 95% 的准确率。所以概率应该更接近一吧?以及如何将这些科学记数法转换为正常百分比?
    • 第一列对应样本属于第一类的概率,第二列代表样本属于第二类的概率,抱歉没有说清楚,我再补充那就是答案。
    • 那我想得到最高的概率,然后转换成百分比。你能帮我解决这个问题吗?
    • 正如@Mohammad Akhtar 提到的,也许您可​​以写成:rounded_probabilities = np.round(loaded_model.predict_proba(inputs), n),其中n 是您需要的小数位数。
    猜你喜欢
    • 2020-10-08
    • 2013-11-21
    • 2021-02-11
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2019-12-09
    • 2017-08-19
    相关资源
    最近更新 更多