xgboost中Objective和feval之间的差异

原文地址: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)
  returnlist(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)
  returnlist(metric =“error”,value = err))  #译注:metric为名称,value为分数
}

请注意,它只返回一个名称(metric)和一个分数(value)。通常情况下,fevalobjective可能是相同的。但是有时候,你可能需要有点不同的评分机制,或者没有导数。例如,人们使用logloss作为Objective进行训练,但使用AUC 作为feval来评估模型。

另外,你可以使用feval在模型已经没有改进的时候停止训练。你还可以使用多个feval函数以不同的方式为你的模型打分并观察它们。

总的来说,你不需要feval函数来训练模型,而只是为了评估它,并帮助它尽早停止训练。

你可能感兴趣的:(Data,Mining)