利用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)