gridsearch.predict_proba 结果是列表而不是数组
Posted
技术标签:
【中文标题】gridsearch.predict_proba 结果是列表而不是数组【英文标题】:gridsearch.predict_proba results in list rather than array 【发布时间】:2021-10-09 01:08:24 【问题描述】:我关注example 并尝试使用带有随机森林分类器的网格搜索来生成 roc_auc_score,但是,y_prob=model.predict_proba(X_test) 我生成的是列表(两个数组)而不是一个。所以我想知道这里出了什么问题。
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import label_binarize
from sklearn.model_selection import GridSearchCV, StratifiedShuffleSplit
from sklearn.metrics import roc_auc_score
X = np.random.rand(50,10)
y = np.random.permutation([1] * 25 + [0] * 25)
y= label_binarize(y, classes=[0, 1])
y= np.hstack((1-y, y))
sss = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=7)
index_split = sss.split(X, y)
train_index = []
test_index = []
for train_ind, test_ind in index_split:
train_index.extend(train_ind)
test_index.extend(test_ind)
data_train = X[train_index]
out_train = y[train_index]
data_test = X[test_index]
out_test = y[test_index]
rf = RandomForestClassifier()
grids =
'n_estimators': [10, 50, 100, 200],
'max_features': ['auto', 'sqrt', 'log2'],
'criterion': ['gini', 'entropy']
rf_grids_searched = GridSearchCV(rf,
grids,
scoring = "roc_auc",
n_jobs = -1,
refit=True,
cv = 5,
verbose=10)
rf_grids_searched.fit(data_train, out_train)
rf_best = rf_grids_searched.best_estimator_
y_prob=rf_best.predict_proba(data_test)
print(roc_auc_score(out_test, y_prob))
我的结果:
array([[0.5, 0.5],
[0.5, 0.5],
[0.7, 0.3],
[0.3, 0.7],
[0.7, 0.3],
[0.5, 0.5],
[0.1, 0.9],
[0.6, 0.4],
[0.6, 0.4],
[0.4, 0.6]]), array([[0.5, 0.5],
[0.5, 0.5],
[0.3, 0.7],
[0.7, 0.3],
[0.3, 0.7],
[0.5, 0.5],
[0.9, 0.1],
[0.4, 0.6],
[0.4, 0.6],
[0.6, 0.4]])]
概率为 [0,1] 的预期结果:
array([[0.5, 0.5],
[0.5, 0.5],
[0.7, 0.3],
[0.3, 0.7],
[0.7, 0.3],
[0.5, 0.5],
[0.1, 0.9],
[0.6, 0.4],
[0.6, 0.4],
我还尝试不首先对 y 进行二值化,然后训练 gridsearch 以获取以下数组 y_prob。后来,我对y_test进行二值化,匹配y_prob的维度,得到分数。我想知道顺序是否正确? 代码:
out_test1= label_binarize(out_test, classes=[0, 1])
out_test1= np.hstack((1-out_test1, out_test1))
print(roc_auc_score(out_test1, y_prob))
array([[0.6, 0.4],
[0.5, 0.5],
[0.6, 0.4],
[0.5, 0.5],
[0.7, 0.3],
[0.3, 0.7],
[0.8, 0.2],
[0.4, 0.6],
[0.8, 0.2],
[0.4, 0.6]])
【问题讨论】:
【参考方案1】:网格搜索的predict_proba
方法只是对最佳估计器predict_proba
的分派。从the docstring 到RandomForestClassifier.predict_proba
(强调添加):
返回
p :形状的ndarray(n_samples,n_classes),或n_outputs列表 如果 n_outputs > 1,则为此类数组。 ...
由于您指定了两个输出(y
中的两列),因此您将获得两个目标中每个目标的两个类别的预测概率。
【讨论】:
谢谢。我还尝试不首先对 y 进行二值化,然后训练 gridsearch 以获得以下数组 y_prob。后来我对y_test进行二值化,匹配y_prob的维度,得到分数。但我想知道 roc_auc_score 以这种方式是否正确?结果附在帖子中 一般情况下,不要二值化,从predict_proba
拉出第二列用于auc分数。
打印(roc_auc_score(out_test, y_prob[:, 1]))=0.48?这是否意味着第 1 类的预测概率为 0.48?虽然数据是假设性的,但是 roc 的预测概率能
看起来不错,是的。随机分类器的 auc 为 0.5,但这是渐近的;对于你的小例子,略高于或低于最终并不是不合理的。以上是关于gridsearch.predict_proba 结果是列表而不是数组的主要内容,如果未能解决你的问题,请参考以下文章