如何修改LightGBM非对称损失函数为低估场景施加更高惩罚
LightGBM 低估高罚自定义损失修改方案
首先明确现有代码的残差逻辑:residual = y_true - y_pred,正负值对应场景如下:
residual > 0:真实值 > 预测值,属于低估场景residual < 0:真实值 < 预测值,属于高估场景
原代码仅在residual < 0(高估)时触发高惩罚,你只需将惩罚触发条件调整为residual > 0即可,修改后代码如下:
import numpy as np def custom_asymmetric_train(y_true, y_pred): residual = (y_true - y_pred).astype("float") # 低估(residual>0)时加罚,惩罚系数可根据业务需要调整,这里示例用10 grad = np.where(residual > 0, -2 * 10.0 * residual, -2 * residual) hess = np.where(residual > 0, 2 * 10.0, 2.0) return grad, hess def custom_asymmetric_valid(y_true, y_pred): residual = (y_true - y_pred).astype("float") # 验证损失和训练损失逻辑保持一致 loss = np.where(residual > 0, (residual ** 2) * 10.0, residual ** 2) return "custom_asymmetric_eval", np.mean(loss), False
使用注意事项
- 代码中的
10.0是惩罚系数,数值越大对低估的惩罚力度越强,可根据业务容忍度自行调整为5、20等值 - LightGBM训练时需指定参数
fobj=custom_asymmetric_train,验证时指定feval=custom_asymmetric_valid,同时设置metric="None"避免默认指标干扰
内容的提问来源于stack exchange,提问作者K.D.
相关产品推荐
相关产品推荐

