nu-svr是否无法优化参数C?mlr3结合kernlab调参报错咨询
问题根因
这个报错符合kernlab包的设计逻辑和SVR的算法原理,不属于异常情况:
eps-svr、eps-bsvr两类SVR通过代价参数C控制模型对拟合误差的惩罚力度,因此需要传入C参数nu-svr类SVR使用nu参数替代C的作用,用于约束支持向量的占比范围,本身不支持传入C参数,参数校验失败才会触发报错
解决方案
你当前的搜索空间没有设置参数条件依赖,导致随机搜索采样到type=nu-svr时仍然会传入C参数,触发校验失败。只需修改搜索空间,添加参数生效的条件约束即可:
library(mlr3tuning) learner_ksvm$param_set search_space = ps( type = p_fct(levels = c("eps-svr", "nu-svr")), # C仅在eps-svr类型下生效 C = p_dbl(lower = 0.01, upper = 1, depends = type == "eps-svr"), # 新增nu参数,仅在nu-svr类型下生效 nu = p_dbl(lower = 0.01, upper = 0.99, depends = type == "nu-svr"), epsilon = p_dbl(lower = 0.01, upper = 1) ) measure = msr("regr.rmse") terminator = trm("evals", n_evals = 10) instance = TuningInstanceSingleCrit$new( task = task_train_prerp, learner = learner_ksvm, resampling = rsmp_cv, measure = measure, search_space = search_space, terminator = terminator ) tuner = tnr("random_search") library(progressr) handlers(global = TRUE) handlers("rstudio") tuner$optimize(instance)
补充说明
如果不需要同时对比两类SVR的效果,也可以直接固定type参数为你需要的类型,再对应设置搜索空间,能有效减少调参的算力消耗。
内容的提问来源于stack exchange,提问作者Eduardo A. Sánchez Torres
相关产品推荐
相关产品推荐

