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


26

我的数据集非常不平衡。我正在尝试遵循调整建议并使用,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比率的节点,这是一个非常不同的数字。

有什么提示吗?


可能您可以通过5次5次重复调整CV中的参数。但是,您可能需要编写代码才能做到这一点。
user2149631

Answers:


22

通常,Scale_pos_weight是负类别数与正类别数之比。假设数据集有90个负分类的观测值和10个正分类的观测值,则scale_pos_Weight的理想值应为9。您可以检查以下链接。 http://xgboost.readthedocs.io/en/latest/parameter.html


1
那将如何适用于多类数据集?28节课怎么样?这我不清楚
加布里埃尔齐格勒

1
@Gabriel我相信,那样的话最好去上课。您可以通过使用一个vs休息方法来使用scale_pos_weight。例如,为28个班级创建假人。然后,您可以将每一个用作二进制分类问题。这样,您将处理28种不同的模型。
哈西特·梅塔

我知道了,但是当我使用onevsrest时,分类器是否也不会提供多标签输出,对吗?
加布里埃尔·齐格勒

怎么样 ?。例如:类是A,B,C。因此,您可以使用二进制分类器进行分类(A / Not A),而另一个分类器将是(B / Not B)。您可以为“ n”个班级进行此操作。然后,在与每个分类器相对应的所有概率中,您必须找到一种分配类别的方法。
哈西特·梅塔

我习惯将onevsrest用于多标签,但是我会尝试一下!谢谢!
加布里埃尔·齐格勒

3

所有文档都说应该是:

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

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

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

这对于限制正例乘以极高的权重的效果很有用。


1

我理解您的问题和无奈,但是我不确定这是否可以通过分析计算得出,而是像大多数超级参数一样,您必须凭经验为数据确定一个好的设置,并使用@ user2149631作为交叉验证建议。我已经成功地将SelectFPR与Xgboost和sklearn API结合使用,以通过功能选择降低XGBoost的FPR,然后在0和1.0之间进一步调整scale_pos_weight取得了一些成功。O.9似乎运行良好,但是与其他任何方式一样,YMMV取决于您的数据。如果将数据点发送到XGboost,也可以对其分别进行加权。您必须使用其API,而不是sklearn包装器。这样,您可以加权一组数据点的权重远高于另一组数据点,这将影响其使用的提升算法。


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.