Как создать пользовательский eval_metri c в xgboost / или как редактировать исходный код xgboost? - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь создать пользовательскую метрику оценки вероятности записи пуассона c для использования в xgboost:

  labels <- getinfo(dat,"label")
  err <- -log(dpois(x = labels, lambda = preds))
  return(list(metric = "error", value = err))
}

Все, что я до сих пор видел, указывает на то, что это правильный формат. Однако возникает ошибка «результаты оценки должны иметь имена». Источник этого находится в функции:

format.eval.string <- function(iter, eval_res, eval_err = NULL) {
  if (length(eval_res) == 0)
    stop('no evaluation results')
  enames <- names(eval_res)
  if (is.null(enames))
    stop('evaluation results must have names')
  iter <- sprintf('[%d]\t', iter)
  if (!is.null(eval_err)) {
    if (length(eval_res) != length(eval_err))
      stop('eval_res & eval_err lengths mismatch')
    res <- paste0(sprintf("%s:%f+%f", enames, eval_res, eval_err), collapse = '\t')
  } else {
    res <- paste0(sprintf("%s:%f", enames, eval_res), collapse = '\t')
  }
  return(paste0(iter, res))
} 

Насколько мне известно, после изучения исходного кода в течение нескольких часов, это ошибка. Кроме того, это исключение кажется чисто эстетическим по своей природе. Вызов xgb.train:

    mod <- xgb.train(params = list(
      booster          = "gbtree"
    ),
    objective = like_obj,
    feval = like_eval,
    maximize = FALSE,
    data = dtrain,
    nrounds = 1000,
    watchlist =  list(train=dtrain, test=dtest),
    early_stopping_rounds = 50,
    verbose = 2)

Итак, как мне отформатировать мою оценку metri c, чтобы это работало? Кроме того, как я могу просто отредактировать исходный код для xgboost локально, чтобы избавиться от этого исключения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...