require(xgboost) data(agaricus.train) data(agaricus.test) trainX = agaricus.train$data trainY = agaricus.train$label testX = agaricus.test$data testY = agaricus.test$label dtrain <- xgb.DMatrix(trainX, label=trainY) dtest <- xgb.DMatrix(testX, label=testY) # note: for customized objective function, we leave objective as default # note: what we are getting is margin value in prediction # you must know what you are doing param <- list(max_depth=2,eta=1,silent=1) watchlist <- list(eval = dtest, train = dtrain) num_round <- 2 # user define objective function, given prediction, return gradient and second order gradient # this is loglikelihood loss logregobj <- function(preds, dtrain) { labels <- getinfo(dtrain, "label") preds <- 1/(1 + exp(-preds)) grad <- preds - labels hess <- preds * (1 - preds) return(list(grad = grad, hess = hess)) } # user defined evaluation function, return a pair metric_name, result # NOTE: when you do customized loss function, the default prediction value is margin # this may make buildin evalution metric not function properly # for example, we are doing logistic loss, the prediction is score before logistic transformation # the buildin evaluation error assumes input is after logistic transformation # Take this in mind when you use the customization, and maybe you need write customized evaluation function evalerror <- function(preds, dtrain) { labels <- getinfo(dtrain, "label") err <- as.numeric(sum(labels != (preds > 0)))/length(labels) return(list(metric = "error", value = err)) } # training with customized objective, we can also do step by step training # simply look at xgboost.py's implementation of train bst = xgb.train(param, dtrain, num_round, watchlist, logregobj, evalerror)