原文地址:https://stackoverflow.com/questions/34178287/difference-between-objective-and-feval-in-xgboost
Objective
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
函数直接用于每个树中的每个节点处的拆分过程。
feval
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函数来训练模型,而只是为了评估它,并帮助它尽早停止训练。