Я полагаю, что причина, по которой вы получаете эту ошибку, заключается в том, что второй ученик является «простым» учеником xgboost, а не учеником xgboost, обернутым фильтром, как ваш первый ученик (LearnermakeFilterWrapper возвращает ученика).
Итак, у вас есть два варианта:
- Вы определяете новый paramSet во второй тренировке, где вы «копируете» только ту часть res $ x, которая относится к xgboost, т.е. без fw.perc
- Вы оберните второго ученика 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)