3

我正在尝试使用实例调整一些模型,因此有一个包含多个模型的分支步骤。我已经构建了管道并且在没有需要 trafos 的模型的情况下工作。设置了参数,并且依赖项工作正常。我使用 trafos 是因为我更喜欢在指数范围内搜索,而不是线性搜索某些参数。trafos 在添加依赖项之前工作,但显然管道在没有依赖项的情况下无法工作。添加依赖项会破坏 trafos。

有趣的是,在创建一个代表时,我意识到错误不需要任务、管道等,它发生在 trafo/参数集的级别,但只有当管道中有超过 1 个学习者时!

错误消息是Error in exp(x$classif.svm.gamma) : non-numeric argument to mathematical function

library(mlr3verse)

ps <- ParamSet$new(list(
  ParamFct$new("branch2.selection", levels = c('classif.rpart', 'classif.svm')),
  ParamDbl$new("classif.rpart.cp", lower = 0, upper = 0.05),
  ParamDbl$new("classif.svm.gamma", lower = -9L, upper = -5L),
  ParamInt$new("classif.svm.cost", lower = -2L, upper = 2L)
))

ps$trafo <- function(x, param_set) {
  x$classif.svm.cost = 2^(x$classif.svm.cost)
  x$classif.svm.gamma = exp(x$classif.svm.gamma)
  x
}

ps$add_dep("classif.rpart.cp", 'branch2.selection', CondEqual$new("classif.rpart"))

ps$add_dep("classif.svm.gamma", 'branch2.selection', CondEqual$new("classif.svm"))
ps$add_dep("classif.svm.cost", 'branch2.selection', CondEqual$new("classif.svm"))

generate_design_grid(ps, resolution = 6)
generate_design_grid(ps, resolution = 6)$transpose()

同样,该错误仅在有多个学习者并因此需要依赖项时才会发生(只要它是唯一的学习者,它就可以与分支/取消分支一起使用),并且它使网格在没有该transpose()功能的情况下也很好。

我想知道是否需要为 trafo 编写不同的代码才能在依赖项下正常运行。

4

1 回答 1

1

由于您有依赖关系,参数并不总是处于活动状态,因此不存在于x. 您必须在 trafo 中考虑这一点:

ps$trafo <- function(x, param_set) {
  if (!is.null(x$classif.svm.cost)) {
    x$classif.svm.cost = 2^(x$classif.svm.cost)
  }
  if (!is.null(x$classif.svm.gamma)) {
    x$classif.svm.gamma = exp(x$classif.svm.gamma)
  }
  x
}

找出这一点的一种简单方法是browser()在 trafo 函数中设置断点(或 put )并进行检查x

于 2021-03-25T07:48:17.250 回答