使用rsample+purrr::map2构建嵌套交叉验证时v参数传入报错
解决rsample嵌套交叉验证动态传v参数的问题
你遇到的这个报错是因为rsample的参数检查机制导致的:当你直接在nested_cv的outside参数里写vfold_cv(v = .y)时,R会立刻尝试解析这个调用,但此时.y还没有被map2迭代赋值,所以v参数不是一个有效的单整数,触发了vfold_cv的参数校验错误。
解决方案:延迟vfold_cv的调用时机
我们需要把外层交叉验证对象的创建逻辑延迟到map2的每个迭代步骤中,确保每次迭代时v参数都是明确的单整数值。这里有两种简洁的写法:
写法1:使用匿名函数
library(purrr) library(parsnip) library(rsample) library(tidyr) library(dplyr) data("mtcars") nested <- mtcars %>% select(cyl, disp:gear) %>% group_by(cyl) %>% nest(data = disp:gear) %>% mutate(n = 2:4) # 用mutate替代cbind,更贴合tidyverse风格 # 修改后的map2调用 nested %>% group_by(cyl) %>% mutate(cv = map2(data, n, function(.x, .y) { # 针对当前分组数据和v值,创建外层交叉验证对象 outer_cv <- vfold_cv(.x, v = .y) # 传入nested_cv完成嵌套交叉验证创建 nested_cv(.x, inside = vfold_cv(v = 10, repeats = 3), outside = outer_cv) }))
写法2:使用purrr的公式语法(更简洁)
nested %>% group_by(cyl) %>% mutate(cv = map2(data, n, ~nested_cv( .x, inside = vfold_cv(v = 10, repeats = 3), outside = vfold_cv(.x, v = .y) )))
原理说明
这两种写法的核心都是让vfold_cv在map2的每次迭代时才执行,此时.y已经被赋值为当前分组对应的v值(2、3、4),完全符合vfold_cv对v参数必须是单整数的要求,自然就能避开报错了。
内容的提问来源于stack exchange,提问作者kkz
相关产品推荐
相关产品推荐

