首页 > 解决方案 > 如何在 mlr3proba 的嵌套交叉验证中转换“2 级 ParamUty”类?

问题描述

对于生存分析,我使用mlr3probaR 包。
我的数据集由 39 个特征(连续和因子,我将其全部转换为整数和数字)和目标(时间和状态)组成。
我想调整超参数:num_nodes,在Param_set.
这是一个ParamUty具有默认值的类参数:32,32.
所以我决定改造它。
我编写了如下代码,用于surv.deephit使用“嵌套交叉验证”(具有 10 个内部折叠和 3 个外部折叠)对学习器进行超参数优化。

#task definition
task.mlr <- TaskSurv$new(id = "id", backend = main.dataset, event = 'status', time = 'time')

#learner definition
dh.learner <- lrn('surv.deephit') 
   
#resampling method
resampling <- rsmp('cv', folds =10)
  
#tuner method
tuner <- tnr('random_search')

#measure method
measure <- msr('surv.harrellC')

#termination method
terminator <- trm('stagnation')

#search_space definition(for num_nodes)
search_space <- ps(num_nodes = p_fct(list(c(32,64,128,256)), trafo = function(x) c(sample(x,1), sample(x,1))))

#To check search_space
generate_design_random(search_space,10)$transpose()

当我用 transpose 运行最后几行代码时,它展示了一个 num_nodes 列表,每个包含一个成对的类别,如下所示:

[[1]]$num_nodes
[1] 64 128

[[2]]$num_nodes
[1] 32 256

...

然后我写了以下代码:

#defining autotuner
at <- AutoTuner$new(dh.learner, resampling, measure, terminator, tuner, search_space)

#outer cross validation
resampling_outer <- rsmp('cv', folds = 3)

# nested resampling
nest_rsm <- resample(task.mlr, at, resampling_outer)

但在嵌套重采样的结果中,它显示 num_nodes 为 ,而不是节点对c(32,64,128,256)。像这样的东西:

    num_nodes 
   c(32,64,128,256)
    num_nodes
   c(32,64,128,256)
   ... 

如何用 2 个级别(例如32,64)转换“Param_Uty”?
老实说,我已经大量搜索了这个主题,毕竟我没有找到合适的答案,所以我感谢你的帮助。

标签: rmachine-learningmlr3

解决方案


您好感谢您使用 mlr3proba。实际上,我刚刚写完一个教程来回答这个问题!它涵盖了 mlr3proba 中的神经网络的训练、调整和评估。对于您的具体问题,本教程的相关部分是:

library(paradox)
search_space = ps(
  nodes = p_int(lower = 1, upper = 32),
  k = p_int(lower = 1, upper = 4)
)

search_space$trafo = function(x, param_set) {
  x$num_nodes = rep(x$nodes, x$k)
  x$nodes = x$k = NULL
  return(x)
}

在这里,我调整了两个新的超参数,一个表示每层的节点数,一个表示层数,然后我创建一个转换,将它们组合成所需的超参数,num_nodes.

您应该能够将其应用于您的示例。


推荐阅读