xgboost 如何在算法中使用权重

机器算法验证 r 助推
2022-03-16 00:11:39

将权重作为参数传递给 xgb.DMatrix 是否与将我们的预测变量(例如 y)乘以权重相同?

更详细地说,我有一个数据集,其中包含 3 个可能值 0、1、2 的事故编号。我想按用户每年驾驶的天数对其进行加权,其值类似于 1/ 365、2/365 ... 364/365 和 365/365。

y = [0, 1, 0, 0, 2, 0, 0,1] 重量 = [1/365, 31/365, 60/365, 20/365, 3/365, 50/365, 32/365 ]我的问题是,如果我将 y 转换为 y/weight,并在没有任何权重的情况下传递给 xgboost,是否与仅通过 weight 传递 y 相同?

请注意,我的目标 = 计数:泊松

3个回答

它不会是一样的。检查 XGBoost 如何处理权重:

https://github.com/dmlc/xgboost/issues/144

加权意味着增加一个例子(或一个类)对损失函数的贡献。这意味着该示例的梯度的贡献也将更大。这就是为什么(正如您将在我上面链接的讨论中看到的那样)xgboost 将梯度和粗麻布乘以权重,而不是目标值。

这是不一样的。如果您使用 y/weight 所有示例的权重相同。如果您想更加强调示例,则需要指定带有权重的向量。

一个基于你的 y 和权重的小例子。

y <- c(0, 1, 0, 0, 2, 0, 0,1)
weights <- c(1/365, 31/365, 60/365, 20/365, 3/365, 50/365, 32/365, 165/365)
set.seed(424)
x <- matrix(sample(seq(0, 24, by = 0.1), size = 24, replace = TRUE), 8, 4)


xgboost(data = x, label = y, weight = weights,
        max_depth = 2, eta = 1, nthread = 2, nrounds = 2,
        objective = "count:poisson")

示例权重与复制完全相同(假设整数权重)。因此,在您的情况下,如果 weight = [1/365, 31/365, 60/365, 20/365, 3/365, 50/365, 32/365 ],则与第一个副本相同例如,第二个示例的 31 个副本,依此类推。请注意,无论如何都不会影响目标值,它保持不变。