我正在评估 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 API 的分类器,
predict
返回整数编码的预测类,而不是概率——对于二进制数据,它四舍五入到零或一——所以你不应该使用它的预测来计算 roc-auc分数。
如果您的数据是二进制的,您可以使用
predict_proba(x_val)[:, 1]
返回正类的估计概率,可以与 roc_auc_score
一起使用