要自定义xgboost的目标函数,有两种方式
- 自定义目标函数(objective)
- 自定义评价函数(feval)。
如果是自定义目标函数你需要求解该目标函数的梯度以及二阶梯度。
例子:自定义的objective
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))
}
而另一个则是自定义评价函数,参数:feval 。它的作用并不是用来训练,仅仅是用来评价,比如说,你可以使用logloss作为目标函数来训练,但是使用ks评分来评价,你可以根据这个评价来设计early stopping,或者调参。
例子:自定义的feval
evalerror <- function(preds, dtrain) {
labels <- getinfo(dtrain, "label")
err <- as.numeric(sum(labels != (preds > 0)))/length(labels)
return(list(metric = "error", value = err))
}
param <- list(max_depth=2, eta=1, nthread = 2, silent=1,objective=logregobj, eval_metric=evalerror)
bst <- xgb.train(param, dtrain, num_round, watchlist)
一般我推荐使用第二种方法,也就是自定义feval的方法,不建议使用自定义 objective,因为首先,有的评分你根本没法求梯度,然后自己写的目标函数难免没有bug,有可能效果不是很好。
更详细自定义函数例子可以看:
https://github.com/dmlc/xgboost/blob/master/doc/parameter.md#learning-task-parameters
其他参考:
http://stackoverflow.com/questions/34178287/difference-between-objective-and-feval-in-xgboost
作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者a358463121专栏:http://blog.csdn.net/a358463121,如果涉及源代码请注明GitHub地址:https://github.com/358463121/。商业使用请联系作者。