[英]sklearn classifier - predict_proba threshold that maximizes auc
[英]How to correctly reshape the multiclass output of predict_proba of a sklearn classifier?
我有 10 个班级的多班级问题。 使用任何带有 predict_proba 的 sklearn 分类器,我得到一个 output
(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))
就像您之前所做的那样,这将对应于每一行是 class,每一列都是您的观察:
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. ]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.