Search code examples
rmachine-learningxgboostr-caretmlr

error : argument "x" is missing, with no default?


As im very new to XGBoost, I am trying to tune the parameters using mlr library and model but after using setHayperPars() learning using train() throws an error (in particular when i run xgmodel line): Error in colnames(x) : argument "x" is missing, with no default, and i can't recognize what's this error means, below is the code:

library(mlr)     
library(dplyr)
library(caret) 
library(xgboost)

set.seed(12345)
n=dim(mydata)[1]
id=sample(1:n, floor(n*0.6)) 
train=mydata[id,]
test=mydata[-id,]

traintask = makeClassifTask (data = train,target = "label")
testtask = makeClassifTask (data = test,target = "label")

#create learner
lrn = makeLearner("classif.xgboost",
                   predict.type = "response")

lrn$par.vals = list( objective="multi:softprob",
                      eval_metric="merror")

#set parameter space
params = makeParamSet( makeIntegerParam("max_depth",lower = 3L,upper = 10L),
                       makeIntegerParam("nrounds",lower = 20L,upper = 100L),
                       makeNumericParam("eta",lower = 0.1, upper = 0.3),
                       makeNumericParam("min_child_weight",lower = 1L,upper = 10L), 
                       makeNumericParam("subsample",lower = 0.5,upper = 1), 
                       makeNumericParam("colsample_bytree",lower = 0.5,upper = 1)) 


#set resampling strategy

configureMlr(show.learner.output = FALSE, show.info = FALSE)

rdesc = makeResampleDesc("CV",stratify = T,iters=5L)

# set the search optimization strategy

ctrl = makeTuneControlRandom(maxit = 10L)

# parameter tuning

set.seed(12345)

mytune = tuneParams(learner = lrn, task = traintask, 
                    resampling = rdesc, measures = acc, 
                    par.set = params, control = ctrl,
                    show.info = FALSE)


# build model using the tuned paramters 

#set hyperparameters
lrn_tune = setHyperPars(lrn,par.vals = mytune$x)

#train model
xgmodel = train(learner = lrn_tune,task = traintask)

Could anyone tell me what's wrong!?


Solution

  • You have to be very careful when loading multiple packages that may involve methods with the same name - here caret and mlr, which both include a train method. Moreover, the order of the library statements is significant: here, as caret is loaded after mlr, it masks functions with the same name from it (and possibly every other package loaded previously), like train.

    In your case, where you obviously want to use the train method from mlr (and not from caret), you should declare this explicitly in your code:

    xgmodel = mlr::train(learner = lrn_tune,task = traintask)