利用mlr预测计数

利用mlr预测计数,r,machine-learning,mlr,R,Machine Learning,Mlr,我使用学习者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 21

我使用学习者
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”
得到的输出


处理此问题的最佳方法是什么?

发生这种情况是因为默认情况下,
gbm
会对链路功能规模进行预测(即
distribution=“poisson”
log
)。这由
gbm::predict.gbm
type
参数控制(请参见该函数的帮助页面)。不幸的是,
mlr
默认情况下不提供更改此参数(在mlr bugtracker中)。目前的解决方法是手动添加此参数:

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

通过将此度量值赋给
tuneParams()
中的
measures
参数,可以将其用于调整。(注意,您必须在列表中给出它:
tuneParams(…measures=list(poissllmeasure)…)

mlr不对gbm返回的预测进行任何处理——您能否发布一个完整的示例来说明问题?
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
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)