【问题标题】:Making sense of predicted probabilities for multi-labeled problems理解多标签问题的预测概率
【发布时间】:2016-06-05 17:52:32
【问题描述】:

我目前正在使用 scikit-learn 解决多标签分类问题,但在学习如何获取每个类/标签的预测概率时遇到了一些麻烦 - 类似于 scikit-learn 的 @987654323 @ 方法适用于二元分类任务。

我的 y 是一个 100x10 二维数组,有 10 个独特的类,我使用 scikit-learn 的 ensemble.RandomForestClassifier() 作为我的分类器。

我想做的只是预测一组给定特征属于y 中的一个类(下面记为cl_)的概率。所以基本上我想像这样的输出:

cl_1 | cl_2 | cl_3 | cl_4 | cl_5 | cl_6 | cl_7 | cl_8 | cl_9 | cl_10
---------------------------------------------------------------------
 0.0 |  0.0 |  0.0 | 0.1  |  0.3 | 0.0  | 0.0  |  0.0 | 0.6  | 0.0

注意:我已将随机森林分类器拟合到数据集,.predict() 方法按预期工作。但是,.predict_proba() 方法以 C x M 的形式返回概率,其中 C 是唯一类的数量,而 M 是数据集中的实例数。

澄清/更新:这是来自我的数据集的实际 y 实例:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0]

X_test 上使用.predict_proba() 返回形状为39 x 848,048 的二维数组(其中39 是唯一类的数量,848,048 是实例的数量)。 所以用外行的话来说,我要问的是:自从.predict_proba() 返回(就上面的小图表而言)之后,我该怎么做。

注意:此:

y_hat_proba = clf.predict_proba(X_test)
print(y_hat_proba[0][1])

返回[ 1. 0.]

【问题讨论】:

  • 你是你的类变量吗?你是单机编码还是什么?换句话说,每个类标签都是二进制向量吗?我不明白为什么它是 100 x 10。
  • 是的,已经完成了 preprocessing.MultiLabelBinarizer()。我使用它是因为有多个标签。我以 100 x 10 为例 - 100 是示例实例数,10 是 10 个唯一类。
  • 您能发布一些训练示例的示例输出吗?仅仅是列的总和不等于一吗?因为听起来你想要一个 M x C ndarray 作为你的输出,对吧?
  • 您描述的维度实际上是转置的。它应该是 848048x39。你确定你正确地传递了 X_test (可能需要先转置)。另外,在提问方面,请查看stackoverflow.com/help/mcve
  • 是的 Garrett 我也注意到了,回去检查了 X 和 y,就形状而言一切都很好,所以我不知道为什么输出会被转置。

标签: python scikit-learn


【解决方案1】:

您可以使用.predict_proba(X_test) 来获取每个类别在一组新点上的概率。如果您需要对单个点进行预测,只需确保 X_test 有一行即可。

输出的形状应该是形状 [n_samples, n_classes](在测试集中)。 You can see the function's documentation.

【讨论】:

  • 我讨厌在问题中添加实际代码,因为我觉得这会使事情复杂化,但我认为在这种情况下有必要澄清一下。我将通过更新编辑我的问题。
  • 输出不会是 [n_samples, n_features]。您可能误读了文档
  • 抱歉,如果输入不是稀疏的,它将是 [n_samples, n_classes]。我会更新我的答案。
【解决方案2】:

对此的更新,因为多年来 scikit-learn 已经取得了相当大的进步,而且这种方法比对单个样本的预测更具有普遍性:

目前,predict_proba() 返回一个

ndarray of shape (n_samples, n_classes),或 此类数组的列表

根据the documentation(当前为 sklearn v1.0)。因此,我发现让输出成为 OP 所期望的形状和形式的一种有用方法(这也是我所期望的)是执行以下操作:

# List of length n_labels comprised of numpy arrays each having shape (n_samples, n_classes)
predict_proba_output = model.predict_proba(features_test)

# Make into ndarray of shape (n_samples, n_labels, n_classes)
reshaped_proba_output = np.swapaxes(np.array(predict_proba_output), 0, 1)

请注意,使用 scikit-learn 语法,n_classes 表示“每个目标的基数”。所以在 OP 的全二进制目标的情况下,n_classes=2

【讨论】:

    猜你喜欢
    • 2015-02-01
    • 2022-06-28
    • 2016-11-19
    • 1970-01-01
    • 2021-08-12
    • 2016-05-23
    • 2020-04-13
    • 2019-09-16
    相关资源
    最近更新 更多