使用R语言paradox包定义参数依赖(param1=1-param2)的问题求助
问题分析与解决方案
你的核心问题是winsorizesimple.probs_low未按预期计算为1 - winsorizesimple.probs_high,根源在于因子类型参数的处理逻辑错误,以及可能未正确触发转换函数。
问题原因
winsorizesimple.probs_high是用p_fct定义的因子类型参数,在.extra_trafo中直接传入switch时,匹配的是因子的整数编码(而非字符串水平),导致switch无法找到对应值,最终计算逻辑失效。- 若未明确触发转换,生成的样本会保留原始无效采样值(比如超出0-1范围的-1、2)。
修正方案
方案1:修正转换函数的因子处理逻辑
直接将因子转换为数值,替代冗余的switch语句,确保计算准确:
search_space = ps( # preprocessing interaction_branch.selection = p_fct(levels = c("nop_filter", "modelmatrix")), winsorizesimple.probs_high = p_fct(levels = c("0.99", "0.98", "0.97")), winsorizesimple.probs_low = p_dbl(lower = 0, upper = 1), # ranger ranger.ranger.max.depth = p_fct(levels = c(2L, 10L)), ranger.ranger.splitrule = p_fct(levels = c("gini", "extratrees")), ranger.ranger.mtry.ratio = p_dbl(0.5, 1), # kknn kknn.kknn.k = p_int(1, 10), # extra transformations .extra_trafo = function(x, param_set) { # 将因子类型的高概率值转为数值 high_prob = as.numeric(as.character(x$winsorizesimple.probs_high)) # 计算低概率值 x$winsorizesimple.probs_low = 1 - high_prob x } )
方案2:确保转换函数被触发
生成样本时,需明确指定应用转换逻辑,以generate_design_lhs为例:
library(paradox) # 生成样本并应用转换 design = generate_design_lhs(search_space, n = 10, trafo = TRUE) # 查看修正后的结果 print(design$data)
优化方案:移除冗余参数定义
既然winsorizesimple.probs_low完全由另一参数决定,可直接从搜索空间中移除该参数,仅在转换时生成,避免无效采样:
search_space = ps( # preprocessing interaction_branch.selection = p_fct(levels = c("nop_filter", "modelmatrix")), winsorizesimple.probs_high = p_fct(levels = c("0.99", "0.98", "0.97")), # ranger ranger.ranger.max.depth = p_fct(levels = c(2L, 10L)), ranger.ranger.splitrule = p_fct(levels = c("gini", "extratrees")), ranger.ranger.mtry.ratio = p_dbl(0.5, 1), # kknn kknn.kknn.k = p_int(1, 10), # extra transformations .extra_trafo = function(x, param_set) { high_prob = as.numeric(as.character(x$winsorizesimple.probs_high)) # 动态添加计算后的低概率参数 x$winsorizesimple.probs_low = 1 - high_prob x } )
内容的提问来源于stack exchange,提问作者Mislav Sagovac
相关产品推荐
相关产品推荐

