Я пытаюсь создать пользовательскую метрику оценки вероятности записи пуассона 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 локально, чтобы избавиться от этого исключения?