为啥当我将 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 返回的分数与直接运行模型返回的分数如此不同?