【问题标题】:sklearn - Predict each class's probabilitysklearn - 预测每个类别的概率
【发布时间】:2018-04-19 01:57:31
【问题描述】:

到目前为止,我已经为 another postsklearn documentation 提供了资源

所以总的来说,我想生成以下示例:

X = np.matrix([[1,2],[2,3],[3,4],[4,5]])
y = np.array(['A', 'B', 'B', 'C', 'D'])
Xt = np.matrix([[11,22],[22,33],[33,44],[44,55]])
model = model.fit(X, y)
pred = model.predict(Xt)

但是对于输出,我希望看到每个观察 3 列作为来自 pred 的输出:

 A  |  B  |  C
.5  | .2  | .3
.25 | .25 | .5
...

我的预测中出现的每个类别都有不同的概率。

我相信最好的方法是我上面提供的第二个链接中的Multilabel classification。此外,我认为跳入下面列出的multi-labelmulti-output 模型之一可能是个好主意:

Support multilabel:

    sklearn.tree.DecisionTreeClassifier
    sklearn.tree.ExtraTreeClassifier
    sklearn.ensemble.ExtraTreesClassifier
    sklearn.neighbors.KNeighborsClassifier
    sklearn.neural_network.MLPClassifier
    sklearn.neighbors.RadiusNeighborsClassifier
    sklearn.ensemble.RandomForestClassifier
    sklearn.linear_model.RidgeClassifierCV

Support multiclass-multioutput:

    sklearn.tree.DecisionTreeClassifier
    sklearn.tree.ExtraTreeClassifier
    sklearn.ensemble.ExtraTreesClassifier
    sklearn.neighbors.KNeighborsClassifier
    sklearn.neighbors.RadiusNeighborsClassifier
    sklearn.ensemble.RandomForestClassifier

但是,我正在寻找有更多信心和经验以正确方式做这件事的人。感谢所有反馈。

-bmc

【问题讨论】:

  • 你能澄清一下你到底想要什么作为答案吗?基本上 multilable 是关于将 >= 0 个标签从预定义的标签集中附加到输入示例。它可能没有标签、一个标签或一堆标签。至于多类案例的概率输出 - 大多数情况下,您可以使用 predict_proba 函数为各种分类器获取它。
  • "但是对于输出,我希望看到每个观察 3 列作为 pred 的输出:A | B | C .5 | .2 | .3 .25 | .25 | .5 .. ." 是我要排除的输出。 predict_proba 是否返回每个可能标签的概率?
  • 是的,它基本上是 sklearn 尝试为每个多类分类器实现的功能。但是,对于某些算法(例如 svm,它自然不会提供概率估计),您需要首先向分类器传递一条指令,让其在训练期间估计类概率。例如,对于 svm,它是 svc(probability = True)。然后 predict_proba 会给你每个类的概率。

标签: machine-learning probability multilabel-classification predictive


【解决方案1】:

据我了解,您希望获得多类分类器的每个潜在类的概率。

在 Scikit-Learn 中,它可以通过通用函数 predict_proba 来完成。它适用于 scikit-learn 中的大多数分类器。你基本上打电话:

clf.predict_proba(X)

其中clf 是经过训练的分类器。 作为输出,您将获得每个输入值的每个类的十进制概率数组。

请注意 - 并非所有分类器都会自然地评估类别概率。例如,SVM 不这样做。您仍然可以获得类概率,但要在构建此类分类器时做到这一点,您需要指示它执行概率估计。对于 SVM,它看起来像:

SVC(Probability=True)

安装后,您将能够像以前一样使用predict_proba

我需要警告您,如果分类器不能自然地评估概率,这意味着将使用相当广泛的计算方法来评估概率,这可能会显着增加训练时间。所以我建议你使用自然评估类概率的分类器(具有 softmax 输出的神经网络、逻辑回归、梯度提升等)

【讨论】:

  • 你怎么知道它给出概率的标签的顺序?例如,y_pred = clf.predict_proba(X_test_tfidf[:len(df_test)]) 产生此输出 array([[ 0.29354825, 0.08547672, 0.62097503], [ 0.75855171, 0.13965677, 0.10179152], [ 0.39376194, 0.50768248, 0.09855559], ..., [ 0.78636186, 0.0804752 , 0.13316294], [ 0.32583947, 0.06651614, 0.60764439], [ 0.36811811, 0.53192139, 0.0999605 ]]) 我如何知道第一个、第二个和第三个因子代表什么?
  • @bmc 使用 clf.classes_ 这会给你正确的排序
【解决方案2】:

尝试使用校准模型:

# define model
model = SVC()
# define and fit calibration model
calibrated = CalibratedClassifierCV(model, method='sigmoid', cv=5)
calibrated.fit(trainX, trainy)
# predict probabilities
print(calibrated.predict_proba(testX)[:, 1])

【讨论】:

    猜你喜欢
    • 2018-12-24
    • 1970-01-01
    • 2019-09-16
    • 2020-07-11
    • 2022-06-28
    • 2020-08-25
    • 2020-04-03
    • 2020-11-17
    • 2018-10-29
    相关资源
    最近更新 更多