我正在研究百分比变化的回归问题,我想同时减小数值误差和变化方向的差异,即额外的惩罚将应用于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,但我还是不明白。任何帮助说明这一点也将不胜感激!