Как можно включить фактор блокировки в makeClassifTask() из пакета mlr?

В некоторых классификационных задачах, используя mlr пакет, мне нужно иметь дело с data.frame похож на этот:

set.seed(pi)
# Dummy data frame
df <- data.frame(
   # Repeated values ID
   ID = sort(sample(c(0:20), 100, replace = TRUE)),
   # Some variables
   X1 = runif(10, 1, 10),
   # Some Label
   Label = sample(c(0,1), 100, replace = TRUE)
   )
df 

Мне нужно перекрестной проверки модели, сохраняя вместе значения IDЯ знаю из учебника, что:

https://mlr-org.github.io/mlr-tutorial/release/html/task/index.html

Мы могли бы включить блокирующий фактор в задачу. Это указывало бы на то, что некоторые наблюдения "принадлежат друг другу" и не должны разделяться при разделении данных на обучающие и тестовые наборы для повторной выборки.

Вопрос в том, как я могу включить этот блокирующий фактор в makeClassifTask?

К сожалению, я не смог найти ни одного примера.

1 ответ

Решение

Какая у вас версия mlr? Блокировка должна быть частью этого с некоторого времени. Вы можете найти это непосредственно в качестве аргумента в makeClassifTask

Вот пример для ваших данных:

df$ID = as.factor(df$ID)
df2 = df
df2$ID = NULL
df2$Label = as.factor(df$Label)
tsk = makeClassifTask(data = df2, target = "Label", blocking = df$ID)
res = resample("classif.rpart", tsk, resampling = cv10)

# to prove-check that blocking worked
lapply(1:10, function(i) {
  blocks.training = df$ID[res$pred$instance$train.inds[[i]]]
  blocks.testing = df$ID[res$pred$instance$test.inds[[i]]]
  intersect(blocks.testing, blocks.training)
})
#all entries are empty, blocking indeed works! 

Ответ @jakob-r больше не работает. Я предполагаю, что с cv10 что-то изменилось.

Незначительное изменение для использования "blocking.cv = TRUE"

Полный рабочий пример:

set.seed(pi)
# Dummy data frame
df <- data.frame(
   # Repeated values ID
   ID = sort(sample(c(0:20), 100, replace = TRUE)),
   # Some variables
   X1 = runif(10, 1, 10),
   # Some Label
   Label = sample(c(0,1), 100, replace = TRUE)
   )
df 

df$ID = as.factor(df$ID)
df2 = df
df2$ID = NULL
df2$Label = as.factor(df$Label)
resDesc <- makeResampleDesc("CV",iters=10,blocking.cv = TRUE)
tsk = makeClassifTask(data = df2, target = "Label", blocking = df$ID)
res = resample("classif.rpart", tsk, resampling = resDesc)

# to prove-check that blocking worked
lapply(1:10, function(i) {
  blocks.training = df$ID[res$pred$instance$train.inds[[i]]]
  blocks.testing = df$ID[res$pred$instance$test.inds[[i]]]
  intersect(blocks.testing, blocks.training)
})
Другие вопросы по тегам