【问题标题】:Predicted class along with its corresponding probability预测类别及其相应的概率
【发布时间】:2020-08-25 20:53:45
【问题描述】:

我已经使用 maxvoting(决策树、随机森林、逻辑回归)分类器构建了一个机器学习模型。我的输入为

{ “工资”:50000, “当前贷款”:15000, “信用评分”:616, “申请贷款”:25000 }

当我将此数据传递给我的模型时。它给出的预测为

{“状态”:批准}

但我需要像

一样检索响应

{“状态”:批准,“准确度”:0.87}

任何帮助将不胜感激

【问题讨论】:

标签: python machine-learning scikit-learn decision-tree sklearn-pandas


【解决方案1】:

看起来您可能正在使用 sklearn 的 VotingClassifier。安装好分类器后,您可以通过属性predict_proba 看到与每个类关联的概率。请注意,这不是准确度,而是每个类别的相关概率。因此,如果您希望测试样本属于n 类的概率,则必须在相应列上索引输出y_pred_prob。下面是一个使用 sklearn 的 iris 数据集的例子:

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},

【讨论】:

  • 我已经尝试过您提供的相同示例。但在 import 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}) 时抛出错误跨度>
  • 现在试试看它是否有效@syedjameer 我错过了y_pred_prob 的定义
  • 这对@syed 有帮助吗?不要忘记您可以投票并接受答案。见What should I do when someone answers my question?,谢谢!
  • 谢谢它帮助我@yatu
  • 亲爱的@yatu 我正在尝试使用决策树来实现相同的场景。面临同样的问题。请你帮帮我。如何在使用决策树时获得准确度值。会更有帮助
猜你喜欢
  • 2018-12-24
  • 2018-09-16
  • 1970-01-01
  • 2019-09-16
  • 2018-04-19
  • 2018-09-01
  • 2013-01-26
  • 2016-12-04
  • 2016-05-23
相关资源
最近更新 更多