LGBMRegressor python 中 tweedie/Regression_l1 目标的自定义损失函数

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

我正在使用 LGBMRegressor 模型与 Objective="tweedie"/objective='Regression_l1',我需要创建一个自定义损失函数,该函数采用原始目标并根据业务需求对其进行一些更改。 在开始更改之前,我尝试实现与 tweedie/Regression_l1 完全相同的自定义损失函数,以确保其相同。 我尝试了一些 tweedie 的常规实现,但得到了不同的结果。 有人可以帮忙吗?

model loss-function lightgbm
1个回答
0
投票

查看

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)
© www.soinside.com 2019 - 2024. All rights reserved.