召回率高但精度过低导致数据不平衡

数据挖掘 分类 xgboost 阶级失衡 超参数调整 贝叶斯
2022-01-29 18:12:17

我正在使用 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%?

2个回答

重要的是要了解您的准确率和召回率与二元决策阈值相关联。基本上,使用此阈值将模型的输出转换为二元决策。通常在标准库中实现了默认阈值选择过程,但它们并不真正适用于不平衡的情况。一种选择是使用 predict_proba 并通过在循环中改变阈值自己选择阈值。这样,您将有不同的选择来平衡精度和召回率。鉴于您的 AUPR 较低,因此不保证您会有任何好的选择。

鉴于f1-score和的流行率PR AUC都非常低,如果限制是由数据或模型的性质(特征加上使用的算法)强加,则无法推断。~0.45%

为了更好地理解并解决问题,我建议将问题分为两部分:

  1. 构建适用于所选特征的模型。为此,您可以尝试80-20?为训练和测试创建一个稍微平衡的数据集。一旦您对方法的性能感到满意,请转到下面的 2
  2. 使用你原来的不平衡数据集,看看情况是否更好。如果不是,现在更清楚问题在于数据的不平衡性质,您应该尝试所有处理不平衡类的标准技术。我希望这对您有所帮助,因为否则只有手头的选项正在为少数群体综合或收集更多数据。