客观参数在python中是如何工作的';什么是xgboost?
。这很好,因为对于我的特殊任务,我有一个非常具体的损失函数,我可以计算预测的一阶和二阶导数 需要明确的是,机器学习任务的目标函数通常定义为obj=损失+复杂性 但是,我想保留标准复杂性惩罚,由客观参数在python中是如何工作的';什么是xgboost?,python,machine-learning,xgboost,Python,Machine Learning,Xgboost,。这很好,因为对于我的特殊任务,我有一个非常具体的损失函数,我可以计算预测的一阶和二阶导数 需要明确的是,机器学习任务的目标函数通常定义为obj=损失+复杂性 但是,我想保留标准复杂性惩罚,由Omega(f)=gamma*T+(1/2)*lambda*\sum{j=1}^T(w^2_j)给出,保持不变。这里,T,gamma,lambda,w是树中的叶数,在树的叶节点上进一步划分所需的最小损失减少,分别是关于每个叶的权重和权重向量的L2正则化项 我的问题是,使用,我是否可以将损失函数定义为obje
Omega(f)=gamma*T+(1/2)*lambda*\sum{j=1}^T(w^2_j)
给出,保持不变。这里,T,gamma,lambda,w
是树中的叶数,在树的叶节点上进一步划分所需的最小损失减少,分别是关于每个叶的权重和权重向量的L2正则化项
我的问题是,使用,我是否可以将损失函数定义为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
我们看到,自定义
目标
函数的唯一输入应该是y_pred
和y_true
。所以我不明白,如果我们确实需要定义复杂性项,那么在自定义目标函数中如何定义复杂性参数(t,gamma,lambda,w
)。您确定需要处理复杂性项吗?文档在任何地方都没有提到它,您的comlexity定义中的第二个术语实际上是L2正则化,只要您设置相应的输入参数(reg_lambda
),XGBoost就可以在内部处理它,但如果您想添加L1术语,也有一种方法)我认为这是xgboost中笨拙的术语。设置自定义“目标”函数时,您正在设置自定义损失函数,xgboost随后将其标准正则化添加到损失函数中。如果不是这种情况,如果您设置了一个没有正则化的损失函数,那么您的训练过程不应该以任何方式对参数(如reg_lambda)敏感。通过使用自定义损失函数快速检查我的xgboost笔记本,可以发现提升reg_lambda会严重影响列车时间,因此它一定在做些什么。