原文地址:https://stackoverflow.com/questions/34178287/difference-between-objective-and-feval-in-xgboost
xgboost中的Objective是算法将尝试和优化的函数。根据定义,它必须能够针对给定训练轮次的预测创建一阶(gradient)和二阶(hessian)导数。
自定义Objective函数示例:链接
# 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)) }Objective是训练的关键函数,任何xgboost模型都需要定义它才能训练。Objective函数直接用于每个树中的每个节点处的拆分过程。
xgboost中的feval在优化或训练模型方面没有任何的直接作用。你甚至不需要它就能训练。它不会影响分裂。它所做的只是在训练结束后对你的模型进行评分。下面是自定义feval的例子
evalerror < - function(preds,dtrain){ labels< - getinfo(dtrain,“label”) err < - as.numeric(sum(labels!=(preds> 0)))/ length(labels) return(list(metric =“error”,value = err)) #译注:metric为名称,value为分数 }请注意,它只返回一个名称(metric)和一个分数(value)。通常情况下,feval和objective可能是相同的。但是有时候,你可能需要有点不同的评分机制,或者没有导数。例如,人们使用logloss作为Objective进行训练,但使用AUC 作为feval来评估模型。
另外,你可以使用feval在模型已经没有改进的时候停止训练。你还可以使用多个feval函数以不同的方式为你的模型打分并观察它们。
总的来说,你不需要feval函数来训练模型,而只是为了评估它,并帮助它尽早停止训练。