为什么当我使用GridSearchCV和roc_auc评分时,grid_search.score(X,y)和roc_auc_score(y,y_predict)的分数是不同的?

时间:2018-03-02 01:48:48

标签: python scikit-learn cross-validation auc

我正在使用分层10倍交叉验证来找到模型,该模型预测具有最高auc的X(X具有34个标签)的y(二元结果)。我设置了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 个答案:

答案 0 :(得分:1)

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

查看source code here

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

观察第三个参数needs_threshold。如果为true,则需要y_pred的连续值,例如网格搜索中的概率或置信度得分将从log_reg.decision_function()计算。

当您使用roc_auc_score明确调用y_pr时,您正在使用.predict(),它将输出数据的结果预测类标签,而不是概率。这应该是造成差异的原因。

尝试:

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

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