我目前正在使用scikit-learn
处理多标签分类问题,并且在学习如何获取每个类/标签的预测概率时遇到了一些麻烦 - 类似于scikit-learn的.predict_proba()
方法在二元分类任务上所做的。
我的y
是一个 100x10 2d 数组,有 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]
使用 .predict_proba()
on X_test
返回形状为 39 x 848,048 的 2D 数组(其中 39 是唯一类的数量,848,048 是实例的数量)。所以通俗地说,我要问的是:我如何从.predict_proba()
回报中赚钱(就上面的小图表而言)。
注意:这:
y_hat_proba = clf.predict_proba(X_test)
print(y_hat_proba[0][1])
返回[ 1. 0.]
.predict_proba(X_test)
来获取每个类在新点集上的概率。如果您需要对单个点进行预测,只需确保X_test
只有一行。
输出的形状应为 [n_samples, n_classes] (在测试集中)。您可以查看函数的文档。
进行了更新,因为scikit-learn多年来已经取得了相当大的进步,并且这种方法比预测单个样本更通用:
目前,predict_proba()
返回
形状数组(n_samples、n_classes)或此类数组的列表
根据文档(目前为 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
.