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



我有一个包含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)的形状

你能帮忙吗?提前谢谢!

如果您提到您正在使用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. ]])

最新更新