【问题标题】:XGBoost - Difference between scale_pos_weight and class_weightsXGBoost - scale_pos_weight 和 class_weights 之间的区别
【发布时间】:2020-03-19 19:50:08
【问题描述】:

假设我们有一个高度不平衡的二元分类问题。 现在,XGBoost 为我们提供了 2 个选项来管理训练期间的类不平衡。一种是使用参数scale_pos_weight,另一种是使用DMatrix的weights参数。

例如 - 我可以使用 - params = {'scale_pos_weight' : some value} 或者我可以在创建 DMatrix 时给出类权重,例如 - xgb = xgb.DMatrix(特征, 目标, 权重)

谁能解释一下这两种情况的区别?两种情况下的分数有何不同?

【问题讨论】:

    标签: machine-learning data-science xgboost sklearn-pandas


    【解决方案1】:

    区别

    the (python) documentation 中所述,scale_pos_weight 是一个浮点数(即单个值),它允许您调整分类阈值。 IE。调整模型在整个数据集中预测正值或负值的趋势。

    DMatrixweight 参数需要一个类似数组的对象,用于指定“每个实例的权重”。这样可以更好地控制分类器如何进行预测,因为每个权重都用于缩放正在优化的损失函数。

    一个例子

    为了使这种差异更加具体,假设我们试图在两种情况下预测图片中猫的存在。

    场景一

    在这种情况下,我们的数据集包含有猫或根本没有动物的图像。数据集不平衡,大多数图像没有动物。这里我们可能会使用scale_pos_weight 来增加正面(有猫)图像的权重以处理不平衡。

    一般来说,我们倾向于将scale_pos_weight 设置为与不平衡成比例。例如,如果 20% 的图像包含一只猫,我们会将 scale_positive_weight 设置为 4。 (当然,这个超参数应该根据经验设置,例如使用交叉验证,但这是一个合理的初始/默认值。)

    场景二

    在这种情况下,我们的数据集再次出现不平衡,猫与“无猫”图像的比例相似。但是,这一次它还包括一些带有狗的图像。潜在地,我们的分类器可能倾向于将狗误认为猫,从而降低其性能,并且误报率更高。在这种情况下,我们可能希望使用DMatrixweight 参数指定每个样本的权重。实际上,我们会尝试惩罚与狗相关的误报,这在将单一因素应用于整体分类阈值的情况下是不可能的。

    【讨论】:

    • 非常感谢您抽出宝贵的时间写出如此精彩的答案。我心里还是有很多疑惑。我想了解使用这些对结果的影响究竟是什么。假设我有一个高度倾斜的问题,我决定将 scale_pos_weight 值设为 5.0 以平衡积极因素。在这种情况下,我没有使用 DMatrix 的权重参数。假设该模型在测试集上的得分为 0.70。在第二种情况下,我没有给出 scale_pos_weight 参数,而是给出 weight 参数中的权重数组,有点像 [1, 5.0, 1, 5.0...]
    • 这里如前所述,数组中的 5.0 对应于我们数据中的正样本。你仍然期望模型在测试数据上给出 0.70 的分数吗?如果是,那么如何?因为我得到了不同的结果。
    • @VatsalGupta 这是个好问题。我自己对此进行了测试,并没有得到相同的分数。我非常简单的期望是scale_pos_weight 的行为更类似于移动分类边界,而DMatrix weights 改变边界的形状。我的理解是DMatrix weights 与目标(损失)函数的梯度和粗麻布相乘,直接影响树的构造。 scale_pos_weight 是作为 sklearn 包装器的一部分提供的,我不确定它是如何应用的,它可能只应用于叶节点。
    猜你喜欢
    • 1970-01-01
    • 2016-10-22
    • 2016-03-14
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    • 2010-10-28
    • 2015-10-04
    相关资源
    最近更新 更多