Как в MLR установить для логического гиперпараметра только значение TRUE или FALSE? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть этот набор данных, чтобы попытаться выполнить задачу классификации с использованием classif.ada

library(mlr)
data("HouseVotes84")
#Using HouseVotes84 as Classification Task Dataset and mtcars as Regression Task Dataset
dummy_data_classif <- HouseVotes84[,2:length(colnames(HouseVotes84))] %>% 
  mutate_if(is.factor, as.numeric)
dummy_data_classif <- data.frame(cbind(Class=HouseVotes84[,1], dummy_data_classif))
dummy_data_classif[is.na(dummy_data_classif)] <- 0
dummy_data_classif_numeric <- dummy_data_classif[-1] %>%
  mutate_if(is.factor, as.numeric)
dummy_data_classif_numeric <- data.frame(cbind(dummy_data_classif[1], 
                                               dummy_data_classif_numeric))
colnames(dummy_data_classif_numeric) <- colnames(dummy_data_classif)

, и у меня есть это выражение параметра в строке, которая будет оцениваться позже для параметра classif.ada, установленного в MLR

param_to_eval

"hyperparam <<- makeParamSet(
makeIntegerParam(\"iter\",lower = 50,upper=250), 
makeIntegerParam(\"max.iter\",lower = 30,upper=200), 
makeLogicalParam(\"model.coef\",FALSE, tunable=FALSE), 
makeDiscreteParam(\"loss\",values = c(\"exponential\", \"logistic\")), 
makeDiscreteParam(\"type\",values = c(\"discrete\", \"real\", \"gentle\")), 
makeNumericParam(\"nu\",lower = 0,upper=100), 
makeNumericParam(\"bag.frac\",lower = 0,upper=1), 
makeLogicalParam(\"bag.shift\"), 
makeNumericParam(\"delta\",lower = 0,upper=1e-07), 
makeIntegerParam(\"minsplit\",lower = 1,upper=30), 
makeIntegerParam(\"minbucket\",lower = 1,upper=20), 
makeNumericParam(\"cp\",lower = 0,upper=1), 
makeIntegerParam(\"maxcompete\",lower = 0,upper=6), 
makeIntegerParam(\"maxsurrogate\",lower = 0,upper=7.5), 
makeDiscreteParam(\"usesurrogate\",values = c(0, 1, 2)), 
makeDiscreteParam(\"surrogatestyle\",values = c(0, 1)), 
makeIntegerParam(\"maxdepth\",lower = 1,upper=30))"

Затем я определил задачи для classif.ada и запланировал настроить 20 случайных наборов параметров

task <- makeClassifTask(data = dummy_data_classif_numeric, 
                        target = "Class")
lrn <- makeLearner(cl = "classif.ada", fix.factors.prediction = TRUE)
eval(parse(text=param_to_eval)) 

hyper_search <- makeTuneControlRandom(maxit = 20)
resampling_method <- makeResampleDesc("cv")
    
# Perform tuning
lrn_tune <- tuneParams(learner = "classif.ada", task = task, 
                       resampling = resampling_method, 
                       control = hyper_search, par.set = hyperparam)

В этих примерах я хочу, чтобы гиперпараметр "model.coef" содержал только FALSE значение для настройки. После их запуска model.coef по-прежнему настраивается между TRUE и FALSE и появляется следующая ошибка:

[Tune] Started tuning learner classif.ada for parameter set:
                   Type len   Def               Constr Req Tunable Trafo
iter            integer   -     -            50 to 250   -    TRUE     -
max.iter        integer   -     -            30 to 200   -    TRUE     -
model.coef      logical   - FALSE                    -   -   FALSE     -
loss           discrete   -     - exponential,logistic   -    TRUE     -
type           discrete   -     - discrete,real,gentle   -    TRUE     -
nu              numeric   -     -             0 to 100   -    TRUE     -
bag.frac        numeric   -     -               0 to 1   -    TRUE     -
bag.shift       logical   -     -                    -   -    TRUE     -
delta           numeric   -     -           0 to 1e-07   -    TRUE     -
minsplit        integer   -     -              1 to 30   -    TRUE     -
minbucket       integer   -     -              1 to 20   -    TRUE     -
cp              numeric   -     -               0 to 1   -    TRUE     -
maxcompete      integer   -     -               0 to 6   -    TRUE     -
maxsurrogate    integer   -     -             0 to 7.5   -    TRUE     -
usesurrogate   discrete   -     -                0,1,2   -    TRUE     -
surrogatestyle discrete   -     -                  0,1   -    TRUE     -
maxdepth        integer   -     -              1 to 30   -    TRUE     -
With control class: TuneControlRandom
Imputation value: 1
[Tune-x] 1: iter=233; max.iter=141; model.coef=FALSE; loss=exponential; type=gentle; nu=63.5; bag.frac=0.686; bag.shift=TRUE; delta=3.49e-08; minsplit=21; minbucket=2; cp=0.881; maxcompete=1; maxsurrogate=2; usesurrogate=2; surrogatestyle=0; maxdepth=17
[Tune-y] 1: mmce.test.mean=0.0598309; time: 0.8 min
[Tune-x] 2: iter=230; max.iter=115; model.coef=TRUE; loss=exponential; type=gentle; nu=39.6; bag.frac=0.35; bag.shift=TRUE; delta=4.87e-08; minsplit=1; minbucket=2; cp=0.523; maxcompete=4; maxsurrogate=7; usesurrogate=0; surrogatestyle=1; maxdepth=21
Error in if (any(wt < 0)) stop("negative weights not allowed") : 
  missing value where TRUE/FALSE needed
In addition: Warning message:
In log((1 - errm)/errm) :
 Error in if (any(wt < 0)) stop("negative weights not allowed") : 
  missing value where TRUE/FALSE needed 

Как сделать, чтобы "model.coef" содержал только FALSE?

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Если вы хотите, чтобы одно значение было фиксированным и не включалось в область поиска, вам необходимо установить значение этого параметра вручную и исключить его из области поиска:

hyperparam$pars$model.coef = NULL
learner <- makeLearner("classif.ada", par.vals = list(model.coef = FALSE))
lrn_tune <- tuneParams(learner = learner, task = task, 
                       resampling = resampling_method, 
                       control = hyper_search, par.set = hyperparam)

Имеет смысл оставьте model.coef в определении области поиска (hyperparam объект) напрямую, но ваш пример выглядит так, как будто вы каким-то образом предопределили объект.

1 голос
/ 03 августа 2020

Чтобы создать фиксированный параметр для учащегося, установите его в par.vals при создании учащегося. См. https://mlr.mlr-org.com/reference/makeLearner.html.

Параметры, указанные в ParamSet, всегда будут настроены в указанном диапазоне.

PS: Назначение ParamSet для GlobalEnv с использованием <<- не очень хорошая идея (в общем не только для млр). PS2: обратите внимание, что {mlr} не рекомендуется, и вместо него следует использовать {mlr3}.

...