R语言mlr包makeParamSet如何设置超参数按指定步长调参
mlr包makeParamSet设置固定步长超参数的实现方法
使用makeParamSet完全可以实现ntree按50为步长取值的调优需求,无需额外引入其他工具,有两种成熟实现方案:
- 方案1:直接定义离散参数(推荐,逻辑简单不易出错)
原代码中使用makeIntegerParam定义连续整数区间,才会导致调优时遍历区间内所有整数。你可以直接替换为makeDiscreteParam,显式指定所有需要评估的ntree候选值即可,修改后的参数集代码如下:
该写法下,调优器只会从rf_param <- makeParamSet( makeDiscreteParam("ntree", values = seq(50, 500, by = 50)), makeIntegerParam("mtry", lower = floor((ncol(train)-1)/5), upper = ncol(train)), makeIntegerParam("nodesize", lower = 10, upper = 30), makeIntegerParam("maxnodes", lower = 1, upper = 100) )50、100、150……500这10个预设值中搜索最优ntree,不会遍历区间内其他整数。 - 方案2:整数参数配转换函数(适合候选值数量多、不想手动枚举的场景)
如果后续需要调整步长、候选值较多不想手动枚举,也可以通过参数转换(trafo)实现步长控制:先定义一个小范围的整数索引参数,再通过转换规则将索引映射为目标步长的参数值,代码如下:
该写法调优时搜索的是1-10的整数索引,实际传入随机森林模型的ntree参数会自动按步长50转换,最终效果和方案1完全一致。rf_param <- makeParamSet( makeIntegerParam("ntree_ind", lower = 1, upper = 10), makeIntegerParam("mtry", lower = floor((ncol(train)-1)/5), upper = ncol(train)), makeIntegerParam("nodesize", lower = 10, upper = 30), makeIntegerParam("maxnodes", lower = 1, upper = 100), .trafo = function(x, param_set) { x$ntree <- x$ntree_ind * 50 x$ntree_ind <- NULL return(x) } )
注意:旧版mlr包(非mlr3)的
makeIntegerParam函数原生不支持步长(step)参数,不要直接在函数内传step参数避免报错。
内容的提问来源于stack exchange,提问作者kris
相关产品推荐
相关产品推荐

