Это происходит потому, что gbm
по умолчанию делает прогноз по шкале функции связи (которая log
для distribution = "poisson"
). Это регулируется параметром type
gbm::predict.gbm
(см. Страницу справки этой функции). К сожалению, mlr
не предлагает изменить этот параметр по умолчанию ( было сообщено в багтрекере mlr). Обходной путь - добавить этот параметр вручную:
lrn <- makeLearner("regr.gbm", distribution = "poisson")
lrn$par.set <- c(lrn$par.set,
makeParamSet(
makeDiscreteLearnerParam("type", c("link", "response"),
default = "link", when = "predict", tunable = FALSE)))
lrn <- setHyperPars(lrn, type = "response")
# show that it works:
counttask <- makeRegrTask("counttask", getTaskData(pid.task),
target = "pregnant")
pred <- predict(train(lrn, counttask), counttask)
pred
Имейте в виду, что при настройке параметров для данных подсчета мера регрессии по умолчанию (среднее значение квадратов ошибок), возможно, переоценит соответствие для точек данных с большими значениями подсчета. Квадратная ошибка для прогнозирования «10» вместо «1» такая же, как ошибка прогнозирования «1010» вместо «1001», но в зависимости от вашей цели вы, вероятно, захотите придать больший вес первой ошибке в этом примере.
Возможное решение - использовать (нормализованное) среднее значение логарифмического вероятности Пуассона в качестве меры:
poisllmeasure = makeMeasure(
id = "poissonllnorm",
minimize = FALSE,
best = 0,
worst = -Inf,
properties = "regr",
name = "Mean Poisson Log Likelihood",
note = "For count data. Normalized to 0 for perfect fit.",
fun = function(task, model, pred, feats, extra.args) {
mean(dpois(pred$data$truth, pred$data$response, log = TRUE) -
dpois(pred$data$truth, pred$data$truth, log = TRUE))
})
# example
performance(pred, poisllmeasure)
Эту меру можно использовать для настройки, задав ее параметру measures
в tuneParams()
. (Обратите внимание, вы должны будете указать его в списке: tuneParams(... measures = list(poisllmeasure) ...)
)