Прогнозирование количества с использованием млр - PullRequest
0 голосов
/ 31 октября 2018

Я использую ученика regr.gbm для прогнозирования количества. Вне mlr, используя пакет gbm напрямую, я использую distribution = "poisson" и predict.gbm, используя type = "response", возвращает прогнозы в исходном масштабе, однако я отмечаю, что когда я делаю это, используя mlr, прогнозы представляются в логарифмическом масштабе:

     truth    response
913      4  0.67348708
914      1  0.28413256
915      3  0.41871237
916      1  0.13027792
2101     1 -0.02092168
2102     2  0.23394970

Однако «истина» не находится в масштабе журнала, и поэтому я обеспокоен тем, что процедуры настройки гиперпараметров в mlr не будут работать. Для сравнения, это вывод, который я получаю с distribution = "gaussian".

     truth response
913      4 2.028177
914      1 1.334658
915      3 1.552846
916      1 1.153072
2101     1 1.006362
2102     2 1.281811

Как лучше всего справиться с этим?

1 Ответ

0 голосов
/ 01 ноября 2018

Это происходит потому, что 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) ...))

...