Я хотел бы выполнить выбор объекта методом обертки для набора данных радужной оболочки, используя пакет mlr, однако я хотел бы посмотреть только на группы объектов, связанных с Petal и / или Sepal.Таким образом, вместо того, чтобы рассматривать 4 объекта в разных комбинациях, процедура-оболочка будет рассматривать две группы объектов в разных комбинациях.
В документации mlr говорится, что это можно выполнить с использованием двух аргументов bit.names
и bit.to.feature
:
bit.names [символ] Имена битов, кодирующих решения.Также определяет общее количество бит в кодировке.По умолчанию это имена элементов задачи.
bits.to.features [function (x, task)] Функция, которая преобразует вектор целого числа 0-1 в вектор символов выбранных объектов.По умолчанию значение 1 в i-м бите выбирает i-ую функцию для решения-кандидата.
Я не смог найти никаких примеров использования этих двух аргументов в учебниках по mlr или где-либо еще.
Я буду использовать пример, приведенный в ?mlr::selectFeatures
.
Сначала включите все функции
library(mlr)
rdesc <- makeResampleDesc("Holdout")
ctrl <- makeFeatSelControlSequential(method = "sfs",
maxit = NA)
res <- selectFeatures("classif.rpart",
iris.task,
rdesc,
control = ctrl)
analyzeFeatSelResult(res)
Это работает, как и ожидалось
Для запусканад группами объектов я проектирую матрицу 0/1 для сопоставления объектов с группами (я не уверен, что это путь, это просто логично):
mati <- rbind(
c(0,0,1,1),
c(1,1,0,0))
rownames(mati) <- c("Petal", "Sepal")
colnames(mati) <- getTaskFeatureNames(iris.task)
матрица выглядит так:
Sepal.Length Sepal.Width Petal.Length Petal.Width
Petal 0 0 1 1
Sepal 1 1 0 0
и теперь я запускаю:
res <- selectFeatures("classif.rpart",
iris.task,
rdesc,
control = ctrl,
bit.names = c("Petal", "Sepal"),
bits.to.features = function(x = mati, task) mlr:::binaryToFeatures(x, getTaskFeatureNames(task)))
analyzeFeatSelResult(res)
#output
Features : 1
Performance : mmce.test.mean=0.0200000
Sepal
Path to optimum:
- Features: 0 Init : Perf = 0.66 Diff: NA *
- Features: 1 Add : Sepal Perf = 0.02 Diff: 0.64 *
Stopped, because no improving feature was found.
Это, кажется, выполняет то, что мне нужно, но я не совсем уверен, что правильно определил аргумент bits.to.features
.
Но когда я пытаюсь использовать тот же подход в оболочке:
outer <- makeResampleDesc("CV", iters = 2L)
inner <- makeResampleDesc("Holdout")
ctrl <- makeFeatSelControlSequential(method = "sfs",
maxit = NA)
lrn <- makeFeatSelWrapper("classif.rpart",
resampling = inner,
control = ctrl,
bit.names = c("Petal", "Sepal"),
bits.to.features = function(x = mati, task) mlr:::binaryToFeatures(x, getTaskFeatureNames(task)))
r <- resample(lrn, iris.task, outer, extract = getFeatSelResult)
я получаю сообщение об ошибке:
Resampling: cross-validation
Measures: mmce
[FeatSel] Started selecting features for learner 'classif.rpart'
With control class: FeatSelControlSequential
Imputation value: 1
[FeatSel-x] 1: 00 (0 bits)
[FeatSel-y] 1: mmce.test.mean=0.7200000; time: 0.0 min
[FeatSel-x] 2: 10 (1 bits)
[FeatSel-y] 2: mmce.test.mean=0.0800000; time: 0.0 min
[FeatSel-x] 2: 01 (1 bits)
[FeatSel-y] 2: mmce.test.mean=0.0000000; time: 0.0 min
[FeatSel-x] 3: 11 (2 bits)
[FeatSel-y] 3: mmce.test.mean=0.0800000; time: 0.0 min
[FeatSel] Result: Sepal (1 bits)
Error in `[.data.frame`(df, , j, drop = drop) :
undefined columns selected
Что я делаю неправильно и чтоправильное использование аргументов bit.names
и bit.to.feature
?
Спасибо
РЕДАКТИРОВАТЬ: я разместил вопрос на mlr github: https://github.com/mlr-org/mlr/issues/2468