为啥当我将 GridSearchCV 与 roc_auc 评分一起使用时,grid_search.score(X,y) 和 roc_auc_score(y, y_predict) 的分数不同?

Posted

技术标签:

【中文标题】为啥当我将 GridSearchCV 与 roc_auc 评分一起使用时,grid_search.score(X,y) 和 roc_auc_score(y, y_predict) 的分数不同?【英文标题】:Why when I use GridSearchCV with roc_auc scoring, the score is different for grid_search.score(X,y) and roc_auc_score(y, y_predict)?为什么当我将 GridSearchCV 与 roc_auc 评分一起使用时,grid_search.score(X,y) 和 roc_auc_score(y, y_predict) 的分数不同? 【发布时间】:2018-08-10 05:20:40 【问题描述】:

我正在使用分层 10 折交叉验证来找到模型,该模型可以从 X(X 有 34 个标签)预测 y(二元结果),并具有最高的 auc。我设置了 GridSearchCV:

log_reg = LogisticRegression()
parameter_grid = 'penalty' : ["l1", "l2"],'C': np.arange(0.1, 3, 0.1),
cross_validation = StratifiedKFold(n_splits=10,shuffle=True,random_state=100)
grid_search = GridSearchCV(log_reg, param_grid = parameter_grid,scoring='roc_auc',
                          cv = cross_validation)

然后进行交叉验证:

grid_search.fit(X, y)
y_pr=grid_search.predict(X)

我不明白以下内容: 为什么grid_search.score(X,y)roc_auc_score(y, y_pr) 给出不同的结果(前者为0.74,后者为0.63)?为什么这些命令在我的情况下不做同样的事情?

【问题讨论】:

好问题!当答案到来时发出一条消息提醒;) 【参考方案1】:

这是由于在 GridSearchCV 中使用时 roc_auc 的初始化不同。

看source code here

roc_auc_scorer = make_scorer(roc_auc_score, greater_is_better=True,
                             needs_threshold=True)

观察第三个参数needs_threshold。当为真时,它将需要y_pred 的连续值,例如在网格搜索中将根据log_reg.decision_function() 计算的概率或置信度分数。

当您使用y_pr 显式调用roc_auc_score 时,您使用的是.predict(),它将输出数据的结果预测类标签而不是概率。这应该可以解释差异。

试试:

y_pr=grid_search.decision_function(X)
roc_auc_score(y, y_pr)

如果结果仍然不一样,请用完整的代码和一些示例数据更新问题。

【讨论】:

非常感谢!太神奇了,结果现在一样!

以上是关于为啥当我将 GridSearchCV 与 roc_auc 评分一起使用时,grid_search.score(X,y) 和 roc_auc_score(y, y_predict) 的分数不同?的主要内容,如果未能解决你的问题,请参考以下文章

best_score_的gridsearch cv的AUC分数与gridsearch cv的最佳模型的auc_roc_score不同

评分“roc_auc”值不适用于gridsearchCV应用RandomForestclassifer

为啥当我使用更多变量时,ROC 中的曲线下面积 (AUC) 会减小?

为啥 GridSearchCV 返回的分数与直接运行模型返回的分数如此不同?

为啥 GridSearchCV 模型结果与我手动调整的模型不同?

为啥在 GridSearchCV 中使用 StandardScaler 时会得到不同的结果?