Задать гиперпараметры учащемуся в млр после настройки параметров - PullRequest
0 голосов
/ 06 июля 2018

Я строю задачу классификации в R с помощью пакета mlr, чтобы настроить гиперпараметры. Я использую набор проверки, и один из этих параметров - это процент переменных, используемых в зависимости от важности с использованием выбора функции (chi.square метод)

lrn = makeFilterWrapper(learner = "classif.xgboost", fw.method = "chi.squared")
params <- makeParamSet(
     makeDiscreteParam("booster",values = c("gbtree","dart")),
     makeDiscreteParam("nrounds", values = 1000, tunable = F),
     makeDiscreteParam("eta", values = c(0.1,0.05,0.2)),
     makeIntegerParam("max_depth",lower = 3L,upper = 10L),
     makeNumericParam("min_child_weight",lower = 1L,upper = 10L),
     makeNumericParam("subsample",lower = 0.5,upper = 1),
     makeNumericParam("colsample_bytree",lower = 0.5,upper = 1),
     makeDiscreteParam("fw.perc", values = seq(0.2, 1, 0.05)))
rdesc = makeResampleDesc("CV", iters = 5)
ctrl <- makeTuneControlRandom(maxit = 1L)
res = tuneParams(lrn, task = valTask2016, resampling = rdesc, par.set = params, control = ctrl)

Я не уверен, что мне нужно выполнить здесь пятикратную перекрестную проверку, но переменная res дает мне все необходимые мне параметры, включая fw.perc, который сократит выбор моей переменной в порядке убывания важность.

У меня вопрос: как я могу использовать эти параметры, чтобы снова использовать повторную выборку (на этот раз с помощью Subsampling), но на этот раз на данных тренировки? Вот что я получил:

rdesc = makeResampleDesc("Subsample", iters = 5, split = 0.8)
lrn = setHyperPars(makeLearner("classif.xgboost"), par.vals = res$x)
r = resample(lrn, trainTask2016, rdesc, measures = list(mmce, fpr, fnr, timetrain))

В этом случае valTask2016 - это задача классификации, которую я использовал для проверки параметров. Я использовал createDummyFeatures для кодирования в горячем режиме, необходимого для XGBoost.

И это ошибка, которую я получил:

Ошибка в setHyperPars2.Learner (учащийся, вставка (par.vals, args)): classif.xgboost: установка параметра fw.perc без доступного объекта описания! Вы имели в виду один из этих гиперпараметров: бустер, эта альфа

1 Ответ

0 голосов
/ 06 июля 2018

Я полагаю, что причина, по которой вы получаете эту ошибку, заключается в том, что второй ученик является «простым» учеником xgboost, а не учеником xgboost, обернутым фильтром, как ваш первый ученик (LearnermakeFilterWrapper возвращает ученика).

Итак, у вас есть два варианта:

  1. Вы определяете новый paramSet во второй тренировке, где вы «копируете» только ту часть res $ x, которая относится к xgboost, т.е. без fw.perc
  2. Вы оберните второго ученика xgboost тем же фильтром

Надеюсь, это имеет смысл.

РЕДАКТИРОВАТЬ : Это работало для меня для второго варианта, используя титановый набор данных:

library(mlr)
library(dplyr)
library(titanic)

sample <- sample.int(n = nrow(titanic_train), size = floor(.7*nrow(titanic_train)), replace = F)
train <- titanic_train[sample, ] %>% select(Pclass, Sex, Age, SibSp, Fare, Survived) %>% mutate(Sex = ifelse(Sex == 'male', 0, 1))

lrn = makeFilterWrapper(learner = "classif.xgboost", fw.method = "chi.squared")

params <- makeParamSet(
  makeDiscreteParam("booster",values = c("gbtree","dart")),
  makeDiscreteParam("nrounds", values = 1000, tunable = F),
  makeDiscreteParam("eta", values = c(0.1,0.05,0.2)),
  makeIntegerParam("max_depth",lower = 3L,upper = 10L),
  makeNumericParam("min_child_weight",lower = 1L,upper = 10L),
  makeNumericParam("subsample",lower = 0.5,upper = 1),
  makeNumericParam("colsample_bytree",lower = 0.5,upper = 1),
  makeDiscreteParam("fw.perc", values = seq(0.2, 1, 0.05)))

classif.task <- mlr::makeClassifTask(data = train,
                                 target = "Survived",
                                 positive = "1")

rdesc = makeResampleDesc("CV", iters = 3)

ctrl <- makeTuneControlRandom(maxit = 2L)

res = tuneParams(lrn, task = classif.task, resampling = rdesc, par.set = params, control = ctrl)

##########################

test <- titanic_train[-sample,] %>% select(Pclass, Sex, Age, SibSp, Fare, Survived) %>% mutate(Sex = ifelse(Sex == 'male', 0, 1))

lrn2 = setHyperPars(makeFilterWrapper(learner = "classif.xgboost", fw.method = "chi.squared"), par.vals = res$x)

classif.task2 <- mlr::makeClassifTask(data = test,
                                 target = "Survived",
                                 positive = "1")

rdesc = makeResampleDesc("CV", iters = 3)
r = resample(learner = lrn2, task = classif.task2, resampling = rdesc, show.info = T, models = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...