使用mlr预测计数

时间:2018-10-31 15:01:48

标签: 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
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 :(得分:2)

之所以会发生这种情况,是因为默认情况下,gbm会根据链接函数范围(对于logdistribution = "poisson")进行预测。这由type的{​​{1}}参数控制(请参阅该功能的帮助页面)。不幸的是,gbm::predict.gbm默认不提供更改此参数的功能(mlr Bugtracker中的it was reported)。现在的解决方法是手动添加此参数:

mlr

请注意,在对计数数据进行参数调整时,默认的回归度量(均方根误差)可能会过分强调适合具有较大计数值的数据点。预测“ 10”而不是“ 1”的平方误差与预测“ 1010”而不是“ 1001”的误差相同,但是在本示例中,根据您的目标,您可能希望对第一个误差施加更大的权重。

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

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) 中的measures参数,可以用于调整。 (请注意,您必须在列表中提供它:tuneParams()