对于不平衡的数据集,xgboost 中 scale_pos_weight 的正确用法是什么?

机器算法验证 不平衡类 助推
2022-02-13 06:42:20

我有一个非常不平衡的数据集。我正在尝试遵循调整建议并使用scale_pos_weight,但不确定我应该如何调整它。

我可以看到这样RegLossObj.GetGradient做:

if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight

所以正样本的梯度会更有影响力。但是,根据xgboost 论文,梯度统计总是在本地使用= 在特定树中特定节点的实例中:

  1. 在节点的上下文中,评估候选分裂的损失减少
  2. 在叶节点的上下文中,优化赋予该节点的权重

因此,没有办法提前知道什么是好的scale_pos_weight- 对于最终正实例和负实例之间的比率为 1:100 的节点和比率为 1:2 的节点来说,这是一个非常不同的数字。

有什么提示吗?

4个回答

通常,scale_pos_weight是负类数与正类数之比。

假设数据集有 90 个负类观察值和 10 个正类观察值,那么理想值scale_pos_weight应该是 9。

请参阅文档:http: //xgboost.readthedocs.io/en/latest/parameter.html

所有文档都说应该是:

scale_pos_weight = count(negative examples)/count(Positive examples)

在实践中,这很好用,但如果您的数据集非常不平衡,我建议使用更保守的方法,例如:

scale_pos_weight = sqrt(count(negative examples)/count(Positive examples)) 

这对于限制正样本乘以非常高的权重的影响很有用。

我理解您的问题和沮丧,但我不确定这是否可以通过分析计算,而是您必须根据经验为您的数据确定一个良好的设置,就像您对大多数超参数所做的那样,使用交叉验证作为 @user2149631建议。我已经成功使用 SelectFPR 与 Xgboost 和 sklearn API 通过特征选择降低 XGBoost 的 FPR,然后进一步将 scale_pos_weight 调整在 0 和 1.0 之间。O.9 似乎运行良好,但与任何事情一样,YMMV 取决于您的数据。如果您查看他们的文档,您还可以在将每个数据点发送到 XGboost 时单独加权。您必须使用他们的 API 而不是 sklearn 包装器。这样,您可以将一组数据点的权重远高于另一组,这将影响它使用的提升算法。

我也偶然发现了这个困境,仍在寻找最佳解决方案。但是,我建议您使用诸如网格搜索(sklearn 中的 GridSearchCV)之类的方法来为您的分类器进行最佳参数调整。但是,如果您的数据集高度不平衡,则值得考虑采样方法(尤其是随机过采样和 SMOTE 过采样方法)并对具有不同正负类示例比率的数据样本进行模型集成。这是一个关于处理不平衡数据集的不错且有用的(几乎全面的)教程。

https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/