为什么当我使用带有 roc_auc 评分的 GridSearchCV 时,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)?
我正在使用分层 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)?为什么这些命令在我的情况下不做同样的事情?
这是由于 roc_auc 在 GridSearchCV 中使用时的不同初始化。
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()
,它将输出数据的结果预测 class 标签,而不是概率。这应该可以解释差异。
尝试:
y_pr=grid_search.decision_function(X)
roc_auc_score(y, y_pr)
如果结果仍然不同,请用完整的代码和一些示例数据更新问题。
我正在使用分层 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)?为什么这些命令在我的情况下不做同样的事情?
这是由于 roc_auc 在 GridSearchCV 中使用时的不同初始化。
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()
,它将输出数据的结果预测 class 标签,而不是概率。这应该可以解释差异。
尝试:
y_pr=grid_search.decision_function(X)
roc_auc_score(y, y_pr)
如果结果仍然不同,请用完整的代码和一些示例数据更新问题。