客观参数在python的xgboost中如何工作?

时间:2018-06-23 08:47:47

标签: python machine-learning xgboost

Gradient boosted trees can take a custom objective function。这很棒,因为对于我的特定任务,我有一个非常具体的损失函数,在其中我可以计算相对于预测的一阶和二阶导数。

要清楚,通常,机器学习任务的目标函数通常定义为obj =损失+复杂性。

但是,我想保持Omega(f) = gamma*T + (1/2)*lambda * \sum_{j=1}^T(w^2_j)给出的标准复杂度惩罚不变。这里的T,gamma,lambda,w是一棵树上的叶子数,在树的叶子节点上进行进一步划分所需的最小损失减少,权重的L2正则化项和每片叶子的权重向量。

我的问题是,使用standard python implementation of xgboost,我可以定义 just loss函数作为objective参数的输入,并让xgboost库处理复杂度术语吗? ?那样很好,因为我不想更改复杂度项或计算其导数。

我的猜测是,不幸的是,我们还必须定义复杂度项,因为根据定义,目标函数是损失和复杂度的线性组合。

注意:如果我们看一下XGBClassifier的注释

from xgboost import XGBClassifier
help(XGBClassifier)
...
|  objective : string or callable
|      Specify the learning task and the corresponding learning objective or
|      a custom objective function to be used (see note below).
...
...
|  Note
|  ----
|  A custom objective function can be provided for the ``objective``
|  parameter. In this case, it should have the signature
|  ``objective(y_true, y_pred) -> grad, hess``:
|  
|  y_true: array_like of shape [n_samples]
|      The target values
|  y_pred: array_like of shape [n_samples]
|      The predicted values
|  
|  grad: array_like of shape [n_samples]
|      The value of the gradient for each sample point.
|  hess: array_like of shape [n_samples]
|      The value of the second derivative for each sample point

我们看到,自定义objective函数的唯一输入应该是y_predy_true。因此,我不明白,如果我们确实需要定义复杂度术语,那么如何在自定义目标函数中定义复杂度参数(T,gamma,lambda,w)。

0 个答案:

没有答案