Unverified Commit 4b1b4124 authored by Michael Mayer's avatar Michael Mayer Committed by GitHub
Browse files

fix calculation of weighted gamma loss (fixes #4174) (#4283)

* fixed weighted gamma obj

* added unit tests

* fixing linter errors

* another linter

* set seed

* fix linter (integer seed)
parent 237ac299
context("Case weights are respected")
test_that("Gamma regression reacts on 'weight'", {
n <- 100L
set.seed(87L)
X <- matrix(runif(2L * n), ncol = 2L)
y <- X[, 1L] + X[, 2L] + runif(n)
X_pred <- X[1L:5L, ]
params <- list(objective = "gamma")
# Unweighted
dtrain <- lgb.Dataset(X, label = y)
bst <- lgb.train(
params = params
, data = dtrain
, nrounds = 4L
, verbose = 0L
)
pred_unweighted <- predict(bst, X_pred)
# Constant weight 1
dtrain <- lgb.Dataset(
X
, label = y
, weight = rep(1.0, n)
)
bst <- lgb.train(
params = params
, data = dtrain
, nrounds = 4L
, verbose = 0L
)
pred_weighted_1 <- predict(bst, X_pred)
# Constant weight 2
dtrain <- lgb.Dataset(
X
, label = y
, weight = rep(2.0, n)
)
bst <- lgb.train(
params = params
, data = dtrain
, nrounds = 4L
, verbose = 0L
)
pred_weighted_2 <- predict(bst, X_pred)
# Non-constant weights
dtrain <- lgb.Dataset(
X
, label = y
, weight = seq(0.0, 1.0, length.out = n)
)
bst <- lgb.train(
params = params
, data = dtrain
, nrounds = 4L
, verbose = 0L
)
pred_weighted <- predict(bst, X_pred)
expect_equal(pred_unweighted, pred_weighted_1)
expect_equal(pred_weighted_1, pred_weighted_2)
expect_false(all(pred_unweighted == pred_weighted))
})
...@@ -695,7 +695,7 @@ class RegressionGammaLoss : public RegressionPoissonLoss { ...@@ -695,7 +695,7 @@ class RegressionGammaLoss : public RegressionPoissonLoss {
} else { } else {
#pragma omp parallel for schedule(static) #pragma omp parallel for schedule(static)
for (data_size_t i = 0; i < num_data_; ++i) { for (data_size_t i = 0; i < num_data_; ++i) {
gradients[i] = static_cast<score_t>(1.0 - label_[i] * std::exp(-score[i]) * weights_[i]); gradients[i] = static_cast<score_t>((1.0 - label_[i] * std::exp(-score[i])) * weights_[i]);
hessians[i] = static_cast<score_t>(label_[i] * std::exp(-score[i]) * weights_[i]); hessians[i] = static_cast<score_t>(label_[i] * std::exp(-score[i]) * weights_[i]);
} }
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment