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

如何在mlr3 Task对象中修改现有特征?

关于mlr3 Task对象特征修改的解决方案

mlr3的Task对象设计为不可变(immutable),无法直接修改现有特征,但可以通过以下几种高效方式实现你的需求,无需每次重新创建任务:

1. 使用$set_data()更新数据(推荐用于排列特征重要性场景)

你可以先提取任务的数据集,修改目标特征后再替换回任务中,任务的元数据(如目标列、特征类型)会被保留,比重建任务更高效:

# 假设已有测试任务test_task
# 1. 提取任务数据
data = test_task$data()
# 2. 对指定特征进行随机排列
data$target_feature = sample(data$target_feature)
# 3. 将修改后的数据替换回任务
test_task$set_data(data)

如果是迭代处理多个特征,建议每次克隆原始任务再修改,避免污染原数据:

# 基准分数计算
base_score = trained_model$predict(original_test_task)$score()
importance_scores = c()

for (feat in original_test_task$feature_names) {
  # 克隆原始任务,避免修改原数据
  temp_task = original_test_task$clone()
  temp_data = temp_task$data()
  # 排列当前特征
  temp_data[[feat]] = sample(temp_data[[feat]])
  temp_task$set_data(temp_data)
  # 计算排列后的分数并记录重要性
  perm_score = trained_model$predict(temp_task)$score()
  importance_scores[feat] = base_score - perm_score
}

2. 用po("mutate")覆盖现有特征

po("mutate")支持直接覆盖已有列,适合在流水线中集成修改逻辑:

# 创建特征排列处理器,覆盖指定特征
permute_po = po("mutate", mutation = list(target_feature = ~sample(.x)))
# 将处理器应用到任务,得到修改后的新任务
modified_task = permute_po$train(list(original_task))[[1]]

注意事项

  • 不要直接修改Task对象的底层数据结构(如task$data()[,feat] = ...),这会破坏mlr3的不可变设计,引发未知问题。
  • 克隆任务($clone())是轻量级操作,仅复制元数据引用,不会深拷贝数据集,性能开销极低。

内容的提问来源于stack exchange,提问作者Yodi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:22:18