【问题标题】:Is Test Set Preprocessing really needed in mlr3?mlr3 中真的需要测试集预处理吗?
【发布时间】:2022-03-08 23:26:51
【问题描述】:

当我在建模框架中包含预处理(选择、插补、转换等)步骤时,在使用 mlr3 框架时,我是否需要在预测之前对测试集重复此操作。我不这么认为,但我想确定这一点。

下面是一个关于任务中特征选择的简单示例。我真的需要在测试集中包含相同的功能还是不需要(test2 行)?结果相同

library(tidyverse)
library(tidymodels)
#> Registered S3 method overwritten by 'tune':
#>   method                   from   
#>   required_pkgs.model_spec parsnip
library(survival)
library(mlr3verse)
#> Loading required package: mlr3
#> 
#> Attaching package: 'mlr3verse'
#> The following object is masked from 'package:tune':
#> 
#>     tune
library(mlr3proba)


data = as_tibble(actg) 

set.seed(123)
split <- data  %>% initial_split(prop = 0.8, strata = censor_d)    
train <- split %>% training()
test  <- split %>% testing()

Task = TaskSurv$new(id = "ACTG", backend = train,  time = "time_d", event = "censor_d") 
Task$add_strata("censor_d")
Task$select(cols = c("txgrp","sex", "raceth", "ivdrug", "cd4", "age"))

rsf = lrn("surv.rfsrc", na.action = "na.impute") 
rsf$train(Task)

test2 = test %>% select(time_d, censor_d, txgrp, sex, raceth, ivdrug, cd4, age) # Is this step required for mlr3?

rsf$predict_newdata(test)$score()
#> surv.cindex 
#>    0.647943
rsf$predict_newdata(test2)$score()
#> surv.cindex 
#>    0.647943

reprex package (v2.0.1) 于 2022 年 3 月 7 日创建

【问题讨论】:

  • 无论您使用哪种 ml 管道,它都应该自动应用于测试数据。如果您发现情况并非如此,则很可能是错误。
  • @missuse。这是我的理解。即使使用未链接到任务的外部数据的 $predict_newdata 也是如此。具体来说,我想确保测试集中的额外变量不用于预测,只有训练中使用的变量用于预测。
  • 无论您使用什么类型的模型/包,在一组变量上训练的模型实际上都不能使用其他变量。

标签: mlr3


【解决方案1】:

在这种特殊情况下,您不需要从测试集中删除特征,因为在具有所选特征的训练集上学习的任何模型都只会使用这些特征(其他特征被简单地忽略)。

一般来说,这取决于你想做什么。例如,如果您已经在训练集上完成了缺失值,您是否需要在测试集上估算缺失值?是的,因为您的模型不知道如何处理缺少的功能。如果你为训练标准化特征,你是否需要为测试做这件事?是的,因为否则您将提供模型特征值,这些值可能远远超出它以前见过的任何范围。

在这两种情况下,您都需要在测试数据上应用用于训练数据的相同插补或归一化。一种简单的方法是使用mlr3pipelines

【讨论】:

    猜你喜欢
    • 2016-11-21
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2017-05-07
    • 1970-01-01
    • 2011-04-25
    • 2013-04-07
    相关资源
    最近更新 更多