为什么常规交叉验证的 roc auc 分数与超参数调整后的 roc auc 分数有很大不同?

问题描述 投票:0回答:1

我正在评估 XGBoost 分类器。我将数据集分为训练集和验证集,使用训练集与模型默认实现执行交叉验证,并计算 ROC AUC:

xgbClassCV = XGBClassifier()
kfold = StratifiedKFold(n_splits = 5)
auc = cross_val_score(xgbClassCV, x_train, y_train, scoring = "roc_auc", cv = kfold)
auc_avg = auc.mean()

ROC AUC (

auc_avg
) 约为 0.76

然后,我使用训练集通过随机交叉验证来执行超参数调整:

xgbGrid = {..., ..., ..., ...}
xgbClassHT = XGBClassifier()
kfold = StratifiedKFold(n_splits = 5)
xgbClassRand = RandomizedSearchCV(estimator = xgbClassHT, param_distributions = xgbGrid, n_iter = 60, \
    cv = kfold, n_jobs = -1, verbose = 2)
xgbClassRand.fit(x_train, y_train)

我检索最佳参数,使用这些参数训练 XGBoost 分类器,使用验证集进行预测并计算 ROC AUC:

xgbClassFT = XGBClassifier(..., ..., ..., ...)
xgbClassFT.fit(x_train, y_train)
predictions = xgbClassFT.predict(x_val)
auc = metrics.roc_auc_score(y_val, predictions)

这个ROC AUC(

auc
)大约是0.65,比上面的低11个点。我觉得这很令人费解,因为我计算的其他分数(例如准确度、精确度、召回率和 F1)不会发生这种情况:它们保持相当相同。

我对逻辑回归重复此过程,并且发生相同的事情:大约。 ROC AUC 之间存在 11 分差异,而其他分数保持不变。

scikit-learn cross-validation hyperparameters auc
1个回答
1
投票

对于遵循 scikit-learn API 的分类器,

predict
返回整数编码的预测类,而不是概率——对于二进制数据,它四舍五入到零或一——所以你不应该使用它的预测来计算 roc-auc分数。

如果您的数据是二进制的,您可以使用

predict_proba(x_val)[:, 1]
返回正类的估计概率,可以与
roc_auc_score

一起使用
© www.soinside.com 2019 - 2024. All rights reserved.