对于 GridSearch 和交叉验证中的 XGBClassifier,我只得到 `accuracy_score` 而不是 `roc_auc`

I am only getting `accuracy_score` instead of `roc_auc` for XGBClassifier in both GridSearch and cross validation

我正在为 Rain in Australia 数据集使用 XGBClassifier,并试图预测今天是否会下雨。我想用 GridSearch 调整分类器的超参数,并用 ROC_AUC 给它打分。这是我的代码:

param_grid = {
    "max_depth": [3, 4, 5, 7],
    "gamma": [0, 0.25, 1],
    "reg_lambda": [0, 1, 10],
    "scale_pos_weight": [1, 3, 5],
    "subsample": [0.8],  # Fix subsample
    "colsample_bytree": [0.5],  # Fix colsample_bytree
}

from sklearn.model_selection import GridSearchCV

# Init the classifier
xgb_cl = xgb.XGBClassifier(objective="binary:logistic", verbose=0)

# Init the estimator
grid_cv = GridSearchCV(xgb_cl, param_grid, scoring="roc_auc", n_jobs=-1)

# Fit
_ = grid_cv.fit(X, y)

当搜索最终完成时,我得到了 .best_score_ 的最佳分数,但不知何故只得到了准确度分数而不是 ROC_AUC。我认为这只是 GridSearch 的情况,所以我尝试 HalvingGridSearchCVcross_val_score 并将 scoring 设置为 roc_auc 但我也得到了它们的准确度分数。我通过用 sklearn.metrics.roc_auc_score.

手动计算 ROC_AUC 来检查这个

我有什么地方做错了吗?或者这种行为的原因是什么?

您是否尝试过自己的 roc_auc 评分规则?似乎您正在为 roc_auc.

传递标签而不是概率(您最初需要)

此处描述的问题: Different result roc_auc_score and plot_roc_curve

本方得分手的解决方案:

更新2

抱歉,今天看到我笔记本上的介绍文字不见了哈哈

在计算 roc_auc_score 时,您可以选择(无论是否使用 gridsearch,使用或不使用管道),您可以将其传递给标签,例如 (0/1) 或概率(0.995, 0.6655)。如果您只是将 probas 转换为标签,第一个应该很容易获得。然而,这将导致(直接反转 L)输出图。这有时看起来很难看。另一种选择是使用预测概率将它们传递给 roc_auc_score。这将导致(阶梯反转 L)输出图,看起来好多了。 所以你首先应该测试的是,如果是的话,你能得到一个带有标签的 roc auc 分数,有和没有网格。然后你应该尝试获得概率。而且,我相信,您必须编写自己的评分方法,因为网格中的 roc-auc_score 仅提供标签,这会导致高分 roc_auc。我给你写了一些东西,你可以看到标签方法:

import xgboost as xgb
from sklearn.metrics import confusion_matrix
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import roc_auc_score

cancer = load_breast_cancer()

X = cancer.data
y = cancer.target

xgb_model = xgb.XGBClassifier(objective="binary:logistic", 
                              eval_metric="auc", 
                              use_label_encoder=False,
                              colsample_bytree = 0.3, 
                              learning_rate = 0.1,
                              max_depth = 5, 
                              gamma = 10, 
                              n_estimators = 10,
                              verbosity=None)

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) 
xgb_model.fit(X_train, y_train)
preds = xgb_model.predict(X_test)

print(confusion_matrix(preds, y_test))
print ('ROC AUC Score',roc_auc_score(y_test,preds))

给出:

[[51  2]  
[ 3 87]] 
ROC AUC Score 0.9609862671660424

在这里你可以看到它高得离谱。

如果你想用网格来做: 摆脱这个:

# Fit
_ = grid_cv.fit(X, y)

只是 grid_cv.fit(x, y) 拟合是一种应用于 grid_cv 的方法,结果存储在 grid_cv

print(grid_cv.best_score_) 应该提供您已经定义的 auc。 另见:different roc_auc with XGBoost gridsearch scoring='roc_auc' and roc_auc_score? 但这也应该是可笑的高,因为您可能会提供标签而不是 probas。

还要注意:

没有人会阻止您将 roc-auc_score 功能应用到您的 grid_results...