如何在LGBM自定义目标函数中复现泊松(Poisson)损失
你当前的自定义泊松损失存在两处核心错误,修改后即可对齐LGBM内置泊松损失的效果:
错误1:二阶导数(海森矩阵)计算逻辑错误
泊松负对数似然损失的求导逻辑为:
- 一阶导数:
grad = exp(y_pred) - y_true(你的这部分计算是正确的) - 二阶导数:
hess = exp(y_pred)(你错误地将max_delta_step加入了二阶导数的计算,导致海森值完全偏离正确数值,训练更新逻辑出错)
错误2:max_delta_step的使用场景错误
max_delta_step是LGBM训练层面的全局参数,作用是限制单棵树的输出上限,避免单次迭代的预测值更新幅度过大、exp()计算后出现数值溢出,该参数不需要写在自定义损失函数的导数计算逻辑里。
正确实现方案
1. 自定义损失函数代码
import numpy as np def custom_poisson_loss(y_true, y_pred): # 可选:对预测值做下截断,避免exp计算出现下溢,和内置逻辑对齐 y_pred = np.clip(y_pred, a_min=-100, a_max=None) grad = np.exp(y_pred) - y_true hess = np.exp(y_pred) return grad, hess
2. 训练参数对齐配置
在LGBM的训练参数中保留max_delta_step=0.7即可,不需要对损失函数做额外修改,其余参数和你使用内置泊松损失时保持完全一致。
你可以先用小样本数据分别测试内置损失和自定义损失的梯度、海森输出,确认二者数值完全一致后再进行全量训练,即可保证最终模型性能对齐。
内容的提问来源于stack exchange,提问作者Cherry Wu
相关产品推荐
相关产品推荐

