我在一个带有232:1二进制类的重不平衡数据库上使用XGBoost分类器训练一个模型。由于我的训练数据包含750 k行和320个特征(在进行了许多特征工程、特征相关滤波和低方差滤波之后),我更喜欢使用scale_pos_weight来处理不平衡而不是过采样的数据。在使用贝叶斯优化方法优化PR参数并进行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%?
发布于 2021-04-09 09:58:14
考虑到f1-score和PR AUC都很低,即使是~0.45%的流行率也很低,如果这些限制是由数据的性质或模型(特征加上所使用的算法)所造成的,则无法推断。
为了更好地理解和解决问题,我建议将问题分为两部分:
80-20?,用于培训和测试。一旦您对您的方法的性能感到满意,请移动到下面的2发布于 2021-05-15 12:53:27
重要的是要理解,您的精确度和召回与二进制决策阈值相关联。基本上,使用此阈值将模型的输出转换为二进制决策。通常在标准库中实现默认的阈值选择过程,但是对于不平衡的情况,它们并不真正有效。一种选择是使用predict_proba并通过改变循环中的阈值来自己选择一个阈值。这样,您将有不同的选择平衡精度和召回。鉴于你的低预报器,这是没有进驻,你将有任何好的选择。
https://datascience.stackexchange.com/questions/92776
复制相似问题