首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mlr预测计数

使用mlr预测计数
EN

Stack Overflow用户
提问于 2018-10-31 23:01:48
回答 1查看 130关注 0票数 2

我正在使用learner regr.gbm来预测计数。在mlr之外,直接使用gbm包,我使用distribution = "poisson"predict.gbm,使用type = "response",返回原始尺度上的预测,但是我注意到,当我使用mlr执行此操作时,预测似乎是对数尺度:

代码语言:javascript
复制
     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"得到的输出。

代码语言:javascript
复制
     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

处理这个问题的最好方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2018-11-02 03:44:06

这是因为gbm在默认情况下对链接函数规模(对于distribution = "poisson"log )进行预测。这是由gbm::predict.gbmtype参数控制的(参见该函数的帮助页面)。不幸的是,默认情况下,mlr不提供更改此参数的功能( mlr错误跟踪器中的it was reported)。目前的解决方法是手动添加此参数:

代码语言:javascript
复制
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”的误差相同,但根据您的目标,您可能希望将更多权重放在本例中的第一个误差上。

一种可能的解决方案是使用(标准化的)平均泊松对数似然作为度量:

代码语言:javascript
复制
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)

通过将此度量赋给tuneParams()中的measures参数,可以使用此度量进行调优。(请注意,您必须以列表形式给出:tuneParams(... measures = list(poisllmeasure) ...))

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53086410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档