我正在使用 XGBoost 分类器在具有 232:1 二进制类的严重不平衡数据库上训练模型。因为我的训练数据包含 750k 行和 320 个特征(在做了许多特征工程、特征相关过滤和低方差过滤之后),我更喜欢使用 scale_pos_weight 来处理不平衡而不是过采样数据。在使用贝叶斯优化参数调整以优化 PR AUC 并进行 5 折交叉验证后,我得到了最好的交叉验证分数,如下所示:
PR AUC = 4.87%, ROC AUC = 78.5%, Precision = 1.49%, and Recall = 80.4%
当我尝试将结果实施到测试数据集时,结果如下:
accuracy: 0.562
roc_auc: 0.776293
pr_auc: 0.032544
log_loss: 0.706263
F1: 0.713779
Confusion Matrix:
[[9946 7804]
[ 18 84]]
precision recall f1-score support
0 1.00 0.56 0.72 17750
1 0.01 0.82 0.02 102
accuracy 0.56 17852
macro avg 0.50 0.69 0.37 17852
weighted avg 0.99 0.56 0.71 17852
我要优化的参数范围(100 次迭代消耗 2-3 天)是:
{'learning_rate':(0.001,0.2),'min_split_loss':(0,20),'max_depth':(3,10),'min_child_weight':(0,50),'max_delta_step':(0,10),'subsample':(0.5,1),'colsample_bytree':(0.5,1),'colsample_bynode':(0.5,1),'colsample_bylevel':(0.5,1),'reg_lambda':(1e-5,100),'reg_alpha':(0,1), 'objective':'binary:logistic','booster':'gbtree','scale_pos_weight':232,'n_estimators':200}
根据业务要求,我们更多地考虑高召回率(以保存正类),但是,我对精度结果太低感到沮丧(这是对保存正类的成本的影响)。是否有任何解决方案可以在不影响召回率的情况下将精度提高至少 10%?