我是 GBM 和 xgboost 的新手,目前xgboost_0.6-2在 R 中使用。模型在标准目标函数下运行良好,"objective" = "reg:linear"在阅读了这篇 NIH 论文后,我想使用自定义目标函数运行分位数回归,但它恰好迭代了 11 次并且指标不变。
我只是在GitHub xgboost 演示之后简单地切换了“pred”语句,但恐怕它比这更复杂,我找不到任何其他使用自定义目标函数的示例。我是否需要更进一步并为“grad”和“hess”部分采用衍生品?
或者它可能是 xgboost 的问题(可疑)?
qntregobj <- function(preds, dtrain) {
qr_alpha = .5
labels <- getinfo(dtrain, "label")
preds <- ifelse( preds - labels >= 0
, (1-qr_alpha)*abs(preds - labels)
, qr_alpha*abs(preds - labels)
)
grad <- preds - labels
hess <- preds * (1 - preds)
return(list(grad = grad, hess = hess))
}
step1.param <- list( "objective" = qntregobj
, "booster" = "gbtree"
, "eval.metric" = "rmse"
, 'nthread' = 16
)
set.seed(123)
step1.xgbTreeCV <- xgb.cv(param = step1.param
, data = xgb.train
, nrounds = nrounds
, nfold = 10
, scale_pos_weight = 1
, stratified = T
, watchlist = watchlist
, verbose = F
, early_stopping_rounds = 10
, maximize = FALSE
## set default parameters here - baseline
, max_depth = 6
, min_child_weight = 1
, gamma = 0
, subsample = 1
, colsample_bytree = 1
, lambda = 1
, alpha = 0
, eta = 0.3
)
print(Sys.time() - start.time)
step1.dat <- step1.xgbTreeCV$evaluation_log
step1.dat
产生:
iter train_rmse_mean train_rmse_std test_rmse_mean test_rmse_std nround
1: 1 122.6362 0.04268346 122.6354 0.3849658 1
2: 2 122.6362 0.04268346 122.6354 0.3849658 2
3: 3 122.6362 0.04268346 122.6354 0.3849658 3
4: 4 122.6362 0.04268346 122.6354 0.3849658 4
5: 5 122.6362 0.04268346 122.6354 0.3849658 5
6: 6 122.6362 0.04268346 122.6354 0.3849658 6
7: 7 122.6362 0.04268346 122.6354 0.3849658 7
8: 8 122.6362 0.04268346 122.6354 0.3849658 8
9: 9 122.6362 0.04268346 122.6354 0.3849658 9
10: 10 122.6362 0.04268346 122.6354 0.3849658 10
11: 11 122.6362 0.04268346 122.6354 0.3849658 11