如何正确重塑 sklearn 分类器的 predict_proba 的多类输出?

时间:2021-04-15 08:00:52

标签: python numpy scikit-learn classification multilabel-classification

我有一个包含 10 个类的多类问题。 使用任何带有 predict_proba 的 sklearn 分类器,我得到的输出为

(n_classes, n_samples, n_classes_probability_1_or_0)

就我而言(10, 4789, 2)

现在使用二元分类,我会这样做

model.predict_proba(X)[:, 1]

我曾假设:

pred = np.array(model.predict_proba(X))
pred = pred.reshape(-1, 10, 2)[:, :, 1]

会做同样的事情,但顺序完全关闭。

现在 y[:, class] 对应于 pred[class, :, 1]

我知道我想错了形状,但不幸的是我看不到。

我如何正确地重塑它? 目标是在 roc_auc_score 指标中使用它 我想要 (instances, classes_probabilities = 1)

的形状

你能帮忙吗? 提前致谢!

1 个答案:

答案 0 :(得分:0)

如果您提到您正在使用 MultiOutputClassifier 会很有用,因为 scikit learn 中的大多数多类分类器都不会返回与您类似的内容,因此使用示例数据集:

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.multioutput import MultiOutputClassifier
from sklearn import preprocessing

lb = preprocessing.LabelBinarizer()

from sklearn.datasets import make_classification
X, y = make_classification(n_samples=500,n_classes=10,n_informative=10,n_clusters_per_class=1)
y = lb.fit_transform(y)

设置分类器

forest = RandomForestClassifier(n_estimators=10, random_state=1)
model = MultiOutputClassifier(forest, n_jobs=-1)
model.fit(X, y)

您无需考虑重塑它,只需提取值即可:

pred = np.array(model.predict_proba(X))

就像您之前所做的那样,这将对应于每一行都是一个类,每一列都是您的观察:

pred[:,:,1].shape
(10, 500)

要获得概率,只需转置:

prob1 = pred[:,:, 1].T

prob1[:2]
array([[0.9, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
       [0.1, 0. , 0.1, 0. , 0.7, 0. , 0.1, 0. , 0.1, 0. ]])

与我们是否实际提取并堆叠比较:

prob2 = np.hstack([i[:,1].reshape(-1,1) for i in model.predict_proba(X)])
array([[0.9, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
   [0.1, 0. , 0.1, 0. , 0.7, 0. , 0.1, 0. , 0.1, 0. ]])
相关问题