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_pred
和y_true
。因此,我不明白,如果我们确实需要定义复杂度术语,那么如何在自定义目标函数中定义复杂度参数(T,gamma,lambda,w
)。