为什么我的自定义lightgbm损失没有减少?

问题描述 投票:0回答:1

我已在lightgbm中实现了自定义MAE损失。梯度为非零,但损耗保持恒定。怎么可能?

我的实现:

def abs_obj(preds, dtrain):
    y_true = dtrain.get_label()
    a = preds - y_true
    grad = np.sign(a)
    hess = np.zeros(len(a))
    return grad, hess

def abs_eval(preds, dtrain):
    y_true = dtrain.get_label()
    loss = np.abs(preds - y_true).sum()
    return "error", loss, False

一个最小的可复制示例:损失保持恒定。

dtrain = pd.DataFrame({'x':np.random.rand(100),
                      'y':np.random.rand(100)})
ytrain = dtrain.x + 2 * dtrain.y
dval = dtrain
yval = ytrain
lgb_train = lgb.Dataset(dtrain, ytrain)
lgb_valid = lgb.Dataset(dval, yval)
params = {'objective':None,
         'learning_rate':30,
         'num_leaves':33}
clf = lgb.train(params,
               lgb_train,
               valid_sets=[lgb_valid],
               num_boost_round=10,
               verbose_eval=1,
               fobj=abs_obj,
               feval=abs_eval)
python lightgbm
1个回答
0
投票

对于自定义的lightgbm损失,您需要一个具有二次微分的正二阶微分函数。

为了加快算法的速度,lightgbm使用Newton's approximation来找到最佳叶子值:

y =-L'/ L''

((有关详细信息,请参见this blogpost

当二阶导数为零或函数不可二次微分时,这种近似是非常错误的。 Lightgbm具有不符合此标准的内置目标函数,例如MAE:对于这些函数,它们具有不同的特殊实现。

© www.soinside.com 2019 - 2024. All rights reserved.