我正在使用 LGBMRegressor 模型与 Objective="tweedie"/objective='Regression_l1',我需要创建一个自定义损失函数,该函数采用原始目标并根据业务需求对其进行一些更改。 在开始更改之前,我尝试实现与 tweedie/Regression_l1 完全相同的自定义损失函数,以确保其相同。 我尝试了一些 tweedie 的常规实现,但得到了不同的结果。 有人可以帮忙吗?
LightGBM#RegressionTweedieLoss()
的 C++ 实现,您可以尝试看看是否可以在 Python 中模拟相同的实现,并查看结果是否不同(在根据业务需求应用更改之前)
类似(Python 中的松散翻译):
import lightgbm as lgb
import numpy as np
class CustomTweedieLoss:
def __init__(self, rho=1.5):
self.rho = rho
def __call__(self, preds, train_data):
labels = train_data.get_label()
exp_1_score = np.exp((1 - self.rho) * preds)
exp_2_score = np.exp((2 - self.rho) * preds)
grad = -labels * exp_1_score + exp_2_score
hess = -labels * (1 - self.rho) * exp_1_score + (2 - self.rho) * exp_2_score
return grad, hess
# Usage:
objective = CustomTweedieLoss(rho=1.5)
LightGBM#RegressionL1loss()
:
import numpy as np
import lightgbm as lgb
class CustomL1Loss:
def __init__(self, weights=None):
self.weights = weights
def __call__(self, preds, train_data):
labels = train_data.get_label()
diff = preds - labels
grad = np.sign(diff)
hess = np.ones_like(preds)
if self.weights is not None:
grad *= self.weights
hess *= self.weights
return grad, hess
# Usage:
# Get the weights data, if any, then:
# objective = CustomL1Loss(weights=weights_data)