对于 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 的情况,所以我尝试 HalvingGridSearchCV
和 cross_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...
我正在为 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 的情况,所以我尝试 HalvingGridSearchCV
和 cross_val_score
并将 scoring
设置为 roc_auc
但我也得到了它们的准确度分数。我通过用 sklearn.metrics.roc_auc_score
.
我有什么地方做错了吗?或者这种行为的原因是什么?
您是否尝试过自己的 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...