首页 > 解决方案 > rsample vfold_cv 函数不接受来自 purrr::map2 的 .y 参数

问题描述

我正在尝试使用该包创建嵌套的交叉验证rsample,并且我使用它purrr::map2来创建它们多次,并根据v参数的规定使用不同的折叠量。但是,该vfold_cv函数不接受v参数,而是出现此错误:Error: v must be a single integer.

在下面的代表中,我mtcars通过为每个圆柱体创建交叉验证来模拟使用数据的情况。用数字替换是可行的,但我需要使用该列.y使参数随每个气缸而变化。n

图书馆(咕噜)
图书馆(欧洲防风草)
库(rsample)
图书馆(tidyr)

数据(“mtcars”)

嵌套 <- mtcars %>%
    选择(气缸,显示:齿轮)%>%
    group_by(cyl) %>%
    嵌套(数据=显示:齿轮)%>%
    cbind(n = 2:4)

嵌套 %>%
    group_by(cyl) %>%
    变异(cv = map2(数据,n,
                     ~nested_cv(.x,
                                里面= vfold_cv(v = 10,重复= 3),
                                外部 = vfold_cv(v = .y))))

错误:`v` 必须是单个整数。

标签: rtidyversecross-validationpurrrtidymodels

解决方案


这是nested_cv里面的vfold_cv函数,你可以试试:

createNested = function(x,y){
    nested_cv(x,inside = vfold_cv(v = 10, repeats = 3),outside = vfold_cv(v = y))
}

createNested(nested$data[[1]],3)
Error in vfold_splits(data = data, v = v, strata = strata, breaks = breaks) : 
  object 'y' not found

所以它看不到y函数内部的变量(比如你的 .y)。所以我写了一个函数来显式地将vfold_cv()for outside的结果传递给nested_cv(),多几行代码,但没关系:

createNested = function(x,y){
    outside_cv = vfold_cv(x,v = y)
    nested_cv(x,inside = vfold_cv(v = 10, repeats = 3),outside = outside_cv)
}

nested <- mtcars %>% 
select(cyl, disp:gear) %>% 
nest(data = disp:gear) %>%
mutate(n=2:4)

nested %>%  mutate(cv = map2(data,n,.f=createNested))

# A tibble: 3 x 4
    cyl data                  n cv              
  <dbl> <list>            <int> <list>          
1     6 <tibble [7 × 8]>      2 <tibble [2 × 3]>
2     4 <tibble [11 × 8]>     3 <tibble [3 × 3]>
3     8 <tibble [14 × 8]>     4 <tibble [4 × 3]>

注意,一旦你嵌套了数据,你就不需要group_by()


推荐阅读