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

如何在MLR3的重采样/基准测试结构中查看PipeOp SMOTE生成的数据

如何在MLR3的重采样/基准测试结构中查看PipeOp SMOTE生成的数据

你遇到的问题其实很常见——在重采样或基准测试流程中,MLR3默认不会留存PipeOp处理后的中间数据,因为每个折的训练过程都是独立进行的,处理后的数据直接传给后续组件就被消耗了。不过我们可以通过两种简单的方式来捕获SMOTE生成的数据,下面结合你的示例代码来讲解:

方法一:在Graph中添加Debug组件保存中间结果

我们可以给你的Graph加入一个debug类型的PipeOp,它会帮我们留存SMOTE处理后的数据集。修改后的代码如下:

# 先创建示例任务(沿用你的代码)
data = smotefamily::sample_generator(1000, ratio = 0.80)
data$result = factor(data$result)
task = TaskClassif$new(id = "example", backend = data, target = "result")

# 修改Graph,加入debug组件
gr = Graph$new() 
gr$add_pipeop(po("smote", dup_size = 140))
# 添加debug PipeOp,用来保存SMOTE输出的数据
gr$add_pipeop(po("debug", id = "smote_debug", keep_results = TRUE))
gr$add_pipeop(mlr_pipeops$get("learner", lrn("classif.ranger", predict_type = "prob")))
# 建立连接:smote -> debug -> 学习器
gr$add_edge("smote", "smote_debug")
gr$add_edge("smote_debug", "classif.ranger")

# 执行重采样
glrn = GraphLearner$new(gr)
rr = resample(task, glrn, rsmp("cv", folds = 3))

# 提取某一折的SMOTE处理后数据(比如第一折)
smote_data_fold1 = rr$learners[[1]]$graph$pipeops$smote_debug$state$result
# 查看类别分布
table(smote_data_fold1$result)

这个debug组件会把SMOTE处理后的任务数据存在自身的state里,重采样完成后,我们可以从每个折对应的学习器实例中提取出来。

方法二:手动遍历重采样折,单独处理并保存数据

如果你不想修改原有Graph的结构,也可以手动遍历每个重采样折,单独运行SMOTE组件并保存结果:

# 沿用之前的示例任务
data = smotefamily::sample_generator(1000, ratio = 0.80)
data$result = factor(data$result)
task = TaskClassif$new(id = "example", backend = data, target = "result")

# 初始化重采样策略
resampling = rsmp("cv", folds = 3)
resampling$instantiate(task)

# 创建列表来保存各折的SMOTE处理后数据
smote_processed_data = list()

# 遍历每个折
for (i in 1:resampling$iters) {
  # 获取当前折的训练子集
  train_idx = resampling$train_set(i)
  task_train = task$clone()$filter(train_idx)
  
  # 单独运行SMOTE PipeOp
  smote_po = po("smote", dup_size = 140)
  smote_result = smote_po$train(list(task_train))[[1]]
  
  # 保存处理后的数据到列表
  smote_processed_data[[paste0("fold_", i)]] = smote_result$data()
}

# 查看第一折的类别分布
table(smote_processed_data$fold_1$result)

这里要提醒你:重采样中每个折的SMOTE都是基于该折的训练子集生成的,所以不同折的处理后数据是不一样的——这也是你之前觉得只能看到"各折部分数据"的原因,本质上每个折的SMOTE输出确实是独立的子集。

备注:内容来源于stack exchange,提问作者user24804654

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 10:40:30