Xgboost中的自定义目标函数,梯度和粗麻布

时间:2018-08-22 19:37:55

标签: r xgboost gradient-descent gbm

我正在研究百分比变化的回归问题,我想同时减小数值误差和变化方向的差异,即额外的惩罚将应用于0.1 vs -0.1,因为预测的百分比变化为负,而实际百分比变化为正。

我想我可以定义一个自定义损失函数,该函数还会惩罚错误的方向,以实现此目标。 (但是欢迎其他可行的方法)。因此,我编写了以下目标函数:

regobj<-function(preds,dtrain){
         labels<-getinfo(dtrain,"label") 
         grad=0.5*(preds-labels)+0.5*((sign(preds)-sign(labels))^2)
         hess = rep(1,length(preds)) # this is just an arbitrary place holder
         return(list(grad = grad, hess = hess))}

然后,我可以在regobj中提供objective作为xgb.train选项来训练模型。

有人可以告诉我渐变grad是否可以这样定义吗?如果我不希望它成为常量,该如何定义hess?现在,使用模拟数据可以正常运行,但是所产生的预测比默认目标函数具有更多的“方向差异”,我不知道为什么。

此外,我很难理解为什么this demo code中的hess被定义为hess <- preds * (1 - preds)。我在github上找到了https://github.com/dmlc/xgboost/issues/15,但我还是不明白。任何帮助说明这一点也将不胜感激!

0 个答案:

没有答案