You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整vfold_cv生成的rset对象各折$data并保留rset属性?

调整vfold_cv重采样折内数据并保留rset属性的方法

在tidymodels框架中,vfold_cv()生成的rset对象本质是带有特定类标记的数据框,其中splits列存储的是rsplit类型的折分对象。直接修改splits$data会破坏rsplit的封装结构,导致整个对象丢失rset属性。要在分折后调整数据且保留属性,需通过规范的方式修改每个rsplit对象,再放回原rset结构中。

核心思路

  1. 提取每个rsplit对象的训练/测试数据,应用自定义调整逻辑
  2. 用make_splits()重新构建合法的rsplit对象,保留原折分的索引和ID信息
  3. 将处理后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 06:47:17