我正在使用学习者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
处理此问题的最佳方法是什么?
答案 0 :(得分:2)
之所以会发生这种情况,是因为默认情况下,gbm
会根据链接函数范围(对于log
是distribution = "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()
)