gpt4 book ai didi

machine-learning - Xgboost-如何使用 "mae"作为目标函数?

转载 作者:行者123 更新时间:2023-11-30 08:21:36 29 4
gpt4 key购买 nike

我知道xgboost需要第一个梯度和第二个梯度,但是其他人使用过“mae”作为obj函数吗?

最佳答案

首先介绍一点理论,抱歉!您询问了 MAE 的 grad 和 hessian,但是,MAE 不是 continuously twice differentiable因此,尝试计算一阶和二阶导数变得很棘手。下面我们可以看到 x=0 处的“扭结”,它阻止了 MAE 连续可微分。

此外,二阶导数在所有表现良好的点处均为零。在 XGBoost 中,二阶导数用作叶子权重的分母,当为零时,会产生严重的数学错误。

考虑到这些复杂性,我们最好的选择是尝试使用其他一些性能良好的函数来近似 MAE。让我们来看看。

Some different loss functions

上面我们可以看到有几个函数可以逼近绝对值。显然,对于非常小的值,平方误差 (MSE) 是 MAE 的相当好的近似值。但是,我认为这不足以满足您的用例。

<强> Huber损失是一个有据可查的损失函数。然而,它并不平滑,因此我们不能保证导数平滑。我们可以使用 Psuedo-Huber 函数对其进行近似。它可以在Python XGBoost中实现如下,

import xgboost as xgb

dtrain = xgb.DMatrix(x_train, label=y_train)
dtest = xgb.DMatrix(x_test, label=y_test)

param = {'max_depth': 5}
num_round = 10

def huber_approx_obj(preds, dtrain):
d = preds - dtrain.get_labels() #remove .get_labels() for sklearn
h = 1 #h is delta in the graphic
scale = 1 + (d / h) ** 2
scale_sqrt = np.sqrt(scale)
grad = d / scale_sqrt
hess = 1 / scale / scale_sqrt
return grad, hess

bst = xgb.train(param, dtrain, num_round, obj=huber_approx_obj)

可以通过替换obj=huber_approx_obj来使用其他函数。

公平损失根本没有很好的记录,但它似乎运作得相当好。公平损失函数为:

Fair Loss Function

可以这样实现,

def fair_obj(preds, dtrain):
"""y = c * abs(x) - c**2 * np.log(abs(x)/c + 1)"""
x = preds - dtrain.get_labels()
c = 1
den = abs(x) + c
grad = c*x / den
hess = c*c / den ** 2
return grad, hess

这段代码取自第二名solution并改编而来在 Kaggle Allstate 挑战赛中。

<强> Log-Cosh 损失函数。

def log_cosh_obj(preds, dtrain):
x = preds - dtrain.get_labels()
grad = np.tanh(x)
hess = 1 / np.cosh(x)**2
return grad, hess

最后,您可以使用上述函数作为模板来创建自己的自定义损失函数。

<小时/>

警告:由于 API 更改,较新版本的 XGBoost 可能需要以下形式的损失函数:

def custom_objective(y_true, y_pred):
...
return grad, hess

关于machine-learning - Xgboost-如何使用 "mae"作为目标函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45006341/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com