【问题标题】:mlr3 - Apply pre-processing to new datamlr3 - 对新数据应用预处理
【发布时间】:2020-10-05 22:03:17
【问题描述】:

在这里使用lmr3verse 包。假设我对用于训练 Learner 的训练集应用了以下预处理:

preprocess <- po("scale", param_vals = list(center = TRUE, scale = TRUE)) %>>%
              po("encode",param_vals = list(method = "one-hot"))

我想使用命令predict(Learner, newdata = pred, predict_type="prob") 预测包含在数据框(带有原始变量)pred 中的新观察结果的标签。这将不起作用,因为 Learner 是使用居中、缩放和 one-hot 编码变量进行训练的。

如何将训练集上使用的相同预处理应用到新数据(仅特征,而不是响应)以进行预测?

【问题讨论】:

  • 当您创建和训练 graphlearner 并使用它来预测新数据时,它将自动对新数据执行经过训练的预处理步骤。因为graphlearner毕竟是一个学习者,所以你可以使用predict method

标签: r mlr3


【解决方案1】:

我不是 100% 确定,但您似乎可以将新数据提供给新任务并将其提供给 predictThis page shows an example of combining mlr_pipeops and learner objects.

library(dplyr)
library(mlr3verse)
df_iris <- iris
df_iris$Petal.Width = df_iris$Petal.Width %>% cut( breaks = c(0,0.5,1,1.5,2,Inf))

task = TaskClassif$new(id = "my_iris", 
                       backend = df_iris, 
                       target = "Species")

train_set = sample(task$nrow, 0.8 * task$nrow)
test_set = setdiff(seq_len(task$nrow), train_set)

task_train = TaskClassif$new(id = "my_iris", 
                       backend = df_iris[train_set,], # use train_set
                       target = "Species")

graph = po("scale", param_vals = list(center = TRUE, scale = TRUE)) %>>%
  po("encode", param_vals = list(method = "one-hot")) %>>%
  mlr_pipeops$get("learner",
                  learner = mlr_learners$get("classif.rpart"))

graph$train(task_train)
graph$pipeops$encode$state$outtasklayout # inspect model input types

graph$pipeops$classif.rpart$predict_type = "prob" 

task_test = TaskClassif$new(id = "my_iris_test",
                       backend = df_iris[test_set,], # use test_set
                       target = "Species")
pred = graph$predict(task_test)
pred$classif.rpart.output$prob

# when you don't have a target variable, just make up one
df_test2 <- df_iris[test_set,]
df_test2$Species = sample(df_iris$Species, length(test_set)) # made-up target

task_test2 = TaskClassif$new(id = "my_iris_test", 
                            backend = df_test2, # use test_set
                            target = "Species")

pred2= graph$predict(task_test2)
pred2$classif.rpart.output$prob

【讨论】:

  • 但是,如果我的 newdata 没有目标怎么办。
  • 我使用了一些虚构的目标变量,它似乎可以工作。 (我还编辑了我之前发布的代码中的一些错误。)
  • 不要使用虚构的目标,而是尝试使用$predict_newdata
  • @jakob-r 你想演示一下吗?那将是我的首选,但mlr3pipelines 的语法对我来说并不直观(而且它似乎与mlr3 的语法不一致)。诚然,我自己没有使用过mlr3pipelines
【解决方案2】:

正如@missuse 所建议的,通过使用graph &lt;- preprocess %&gt;&gt;% Learner 然后graph_learner &lt;- GraphLearner$new(graph) 命令,我可以预测--- predict(TunedLearner, newdata = pred, predict_type="prob") --- 使用原始data.frame

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 2020-08-20
    • 2022-03-08
    • 1970-01-01
    • 2022-09-01
    • 2022-11-17
    • 2016-08-03
    • 2021-10-17
    • 2021-04-26
    相关资源
    最近更新 更多