mlr3: Как выполнить фильтрацию с помощью mlr в наборе обучающих данных и применить результаты к обучению модели?

#r #mlr3

#r #mlr3

Вопрос:

При создании фильтра в mlr3 как вы основываете фильтр только на обучающих данных?

Как только фильтр создан, как применить фильтр к процессу моделирования и подмножеству обучающих данных, чтобы включать только значения фильтра выше определенного порога?

 library(mlr3)
library(mlr3filters)
library(mlr3learners)
library(tidyverse)


data(iris)
iris <- iris %>%
  select(-Species)
  
tsk <- mlr3::TaskRegr$new("iris", 
                          backend = iris, 
                          target = "Sepal.Length")

#split train and test
trn_ids <- sample(tsk$row_ids, floor(0.8 * length(tsk$row_ids)), F)
tst_ids <- setdiff(tsk$row_ids, trn_ids)

#create a filter
filter = flt("correlation", method = "spearman")

# Question 1: how to calculate the filter only for the train IDs?
filter$calculate(tsk)
print(filter)

# Question 2: how to only use only variables with X correlation or greater in training?
learner <- mlr_learners$get("regr.glmnet")
learner$train(tsk, row_ids = trn_ids)
prediction <- learner$predict(tsk, row_ids = tst_ids)
prediction$response
  

Ответ №1:

Фильтры могут быть внедрены в обучаемого с помощью mlr3pipelines .

Здесь в mlr3gallery есть пример (раздел «Фильтрация объектов»).

Основной рецепт заключается в создании графика, подобного этому:

fpipe = po("filter", flt("mim"), filter.nfeat = 3) $>>$ lrn("regr.glmnet")

и обернуть это в GraphLearner :

lrnr = GraphLearner$new(fpipe) .

lrnr теперь может использоваться как любой другой обучаемый и внутренне фильтрует функции в соответствии с указанным фильтром перед обучением обучаемого.