mlr3 - Apply pre-processing to new data

624 views Asked by At

Using lmr3verse package here. Let's say I applied the following pre-processing to the training set used to train Learner:

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

And I would like to predict the label of new observations contained in a dataframe (with the original variables) pred with the command predict(Learner, newdata = pred, predict_type="prob"). This won't work since Learner was trained with centered, scaled, and one-hot encoding variables.

How to apply the same pre-processing used on the training set to new data (only features, not response) in order to make predictions?

2

There are 2 answers

4
KM_83 On BEST ANSWER

I am not 100% sure but it seems you can feed newdata to a new task and feed it to predict. This 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
0
Nip On

As suggested by @missuse, by using graph <- preprocess %>>% Learner and then graph_learner <- GraphLearner$new(graph) commands, I could predict --- predict(TunedLearner, newdata = pred, predict_type="prob") --- using a raw data.frame.