av abhishiek
av abhishiek

Reputation: 667

Can't pass xgb.DMatrix to caret

I am trying tune Hyperparametes of xgboost for a classification problem, using caret library, As there were a lot of factors in my data set and xgboost likes data as numerical, I created a dummy rows using Feature Hashing, but when I get to run caret train , I get an error

#Using Feature hashing to convert all the factor variables to dummies
objTrain_hashed = hashed.model.matrix(~., data=train1[,-27], hash.size=2^15, transpose=FALSE)
#created a dense matrix which is normally accepted by xgboost method in R
#Hoping I could pass it caret as well
dmodel  <- xgb.DMatrix(objTrain_hashed[, ], label = train1$Walc)

xgb_grid_1 = expand.grid(
  nrounds = 500, 
  max_depth = c(5, 10, 15), 
  eta = c(0.01, 0.001, 0.0001), 
  gamma = c(1, 2, 3), 
  colsample_bytree = c(0.4, 0.7, 1.0), 
  min_child_weight = c(0.5, 1, 1.5)
)


xgb_trcontrol_1 = trainControl(
  method = "cv",
  number = 3,
  verboseIter = TRUE,
  returnData = FALSE,
  returnResamp = "all",                                                        # save losses across all models
  classProbs = TRUE,                                                           # set to TRUE for AUC to be computed
  summaryFunction = twoClassSummary,
  allowParallel = TRUE
)

xgb_train1 <- train(Walc ~.,dmodel,method = 'xgbTree',trControl = xgb_trcontrol_1,
                    metric = 'accuracy',tunegrid = xgb_grid_1)

I am getting the following error

Error in as.data.frame.default(data) : 
  cannot coerce class ""xgb.DMatrix"" to a data.frame

Any suggestions, on how I can proceed ?

Upvotes: 4

Views: 1543

Answers (2)

Amir Charkhi
Amir Charkhi

Reputation: 846

This is because you are inputting dmodel into the last part of your code. Try inputting objTrain_hashed, which is a matrix, and not an xgb.DMatrix

Upvotes: 1

Chan-ho Lee
Chan-ho Lee

Reputation: 51

How about sparse.model.matrix() instead of hashed.model.matrix... It works on my PC... and don't transform to xgb.DMatrix() put it in train() function just mere sparse.model.matrix() form.

like...

model_data <- sparse.model.matrix(Y~., raw_data)

and

xgb_train1 <- train(Y ~.,model_data, <bla bla> ...)

Wish it works... thank you.

Upvotes: 0

Related Questions