如何调整vfold_cv生成的rset对象各折$data并保留rset属性?
调整vfold_cv重采样折内数据并保留rset属性的方法
在tidymodels框架中,vfold_cv()生成的rset对象本质是带有特定类标记的数据框,其中splits列存储的是rsplit类型的折分对象。直接修改splits$data会破坏rsplit的封装结构,导致整个对象丢失rset属性。要在分折后调整数据且保留属性,需通过规范的方式修改每个rsplit对象,再放回原rset结构中。
核心思路
- 提取每个
rsplit对象的训练/测试数据,应用自定义调整逻辑 - 用
make_splits()重新构建合法的rsplit对象,保留原折分的索引和ID信息 - 将处理后的
rsplit对象替换回原rset的splits列
代码示例
1. 基础准备
library(tidymodels) # 生成示例数据与10折交叉验证对象 data(iris) vfold_obj <- vfold_cv(iris, v = 10)
2. 定义数据修改与rsplit重构函数
# 自定义数据调整函数:示例为添加花瓣面积列 custom_modify <- function(data) { data %>% mutate(Petal.Area = Petal.Length * Petal.Width) } # 用于修改rsplit对象的工具函数 modify_split <- function(split, modify_fn) { # 提取并修改训练、测试数据 train_data <- training(split) %>% modify_fn() test_data <- testing(split) %>% modify_fn() # 用原索引重构rsplit对象 new_split <- make_splits( indices = split$in_id, data = bind_rows( train_data %>% mutate(.role = "analysis"), test_data %>% mutate(.role = "assessment") ) %>% select(-.role) ) # 保留原折分的ID属性 attr(new_split, "id") <- attr(split, "id") new_split }
3. 批量处理所有折分并保留rset属性
# 应用修改到整个vfold对象 modified_vfold <- vfold_obj %>% mutate(splits = purrr::map(splits, ~modify_split(.x, custom_modify))) # 验证对象类型:仍保留rset与vfold_cv类 class(modified_vfold) # 输出:"vfold_cv" "rset" "tbl_df" "tbl" "data.frame"
关键注意事项
- 不要直接修改
rsplit对象的内部字段(如splits$data),这种操作会破坏其封装结构,导致类属性丢失 - 如果仅需调整训练数据或测试数据,可在
modify_split函数中只处理对应部分,无需同时修改两者 - 使用
make_splits()是官方推荐的重构rsplit对象的方式,能确保兼容性与结构合法性
内容的提问来源于stack exchange,提问作者Anna Jackson
相关产品推荐
相关产品推荐

