问题描述
我正在尝试使用实例来调整一些模型,因此有一个包含多个模型的分支步骤。我已经建造了管道并且在没有需要 trafos 的模型的情况下工作。参数已设置,依赖项工作正常。我使用 trafos 是因为我更喜欢在指数范围内搜索而不是线性搜索某些参数。 trafos 在添加依赖项之前工作,但显然管道在没有依赖项的情况下无法工作。添加依赖项会破坏 trafos。
有趣的是,在创建 reprex 时,我意识到错误不需要任务、管道等,它发生在 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",CondEqual$new("classif.svm"))
ps$add_dep("classif.svm.cost",CondEqual$new("classif.svm"))
generate_design_grid(ps,resolution = 6)
generate_design_grid(ps,resolution = 6)$transpose()
同样,错误只发生在有多个学习者并因此需要依赖关系时(只要它是唯一的学习者,它就可以与分支/非分支一起工作),并且它使网格在没有 transpose()
功能。
我想知道我是否需要编写一些不同的代码才能让 trafo 在依赖项下正常运行。
解决方法
由于存在依赖关系,参数并不总是处于活动状态,因此不会出现在 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
}
找出这一点的一种简单方法是在 trafo 函数中设置断点(或放置 browser()
)并检查 x
。