MLR3 在学习者分支/依赖项中使用 trafo转换在转置时遇到“非数字参数”错误

问题描述

我正在尝试使用实例来调整一些模型,因此有一个包含多个模型的分支步骤。我已经建造了管道并且在没有需要 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...