我尝试为GridSearchCV
创建一个自定义得分手。这是函数的定义:
def custom_auc(ground_truth, probas_):
fpr, tpr, _ = roc_curve(ground_truth, probas_[:, 1], pos_label=1)
return auc(fpr, tpr)
然后我用它来创建一个名为my_auc
的自定义计分器:
# to be standart sklearn's scorer
my_auc = make_scorer(custom_auc, greater_is_better=True, needs_proba=True)
然后,我在GridSearchCV中使用此自定义评分器:
param_grid={'C': np.logspace(-2, 2, 40)}
clf = sklearn.model_selection.GridSearchCV(linear_model.LogisticRegression(),
param_grid = param_grid,
cv = 10,
scoring = my_auc,
verbose=False,
n_jobs=-1)
best_clf = clf.fit(X_train, y_train)
拟合模型的行会引发以下错误:
IndexError:数组的索引过多
问题在于,将预测(1或0)而不是概率传递给custom_auc
。也就是说,probas
保留了预测。
我对此进行了测试,并且有效:
return sklearn.metrics.roc_auc_score(ground_truth, probas_)
我更喜欢自己的计分器,而不是现有的'roc_auc'
,因为我想根据https://stackoverflow.com/a/31161137/1845408中所建议的假阳性率和真实阳性率来计算auc
得分。
有帮助吗?