python - 如何在python中实现负二项式损失函数以用于轻型GBM?

标签 python machine-learning gradient lightgbm hessian-matrix

我有一个机器学习问题,我相信负二项式损失函数很适合,但是 light gbm 包没有将其作为标准,我正在尝试实现它,但我不知道如何实现获得 Gradient 和 Hessian,有谁知道我该怎么做?我设法获得了损失函数,但我无法获得梯度和粗麻布。

import math

def custom_asymmetric_valid(y_pred,y_true):
    y_true = y_true.get_label()
    p = 0.5
    n = y_pred
    loss = math.gamma(n) + math.gamma(y_true + 1) - math.gamma(n + y_true) - n * math.log(p) - y_true * math.log(1 - p)
    return "custom_asymmetric_eval", np.mean(loss), False


现在如何获得 Gradient 和 Hessian?
def custom_asymmetric_train(y_pred,y_true):
    residual = (y_true.get_label() - y_pred).astype("float")

    grad = ?
    hess = ?

    return grad, hess


任何人都可以帮忙吗?

最佳答案

这可以通过 scipy 自动实现:

from scipy.misc import derivative
from scipy.special import gamma

def custom_asymmetric_train(y_pred, dtrain):

    y_true = dtrain.label
    p = 0.5

    def loss(x,t):
        loss = gamma(x) + gamma(t+1) - gamma(x+t) - x*np.log(p) - t*np.log(1-p)
        return loss

    partial_d = lambda x: loss(x, y_true)
    grad = derivative(partial_d, y_pred, n=1, dx=1e-6)
    hess = derivative(partial_d, y_pred, n=2, dx=1e-6)

    return grad, hess

关于python - 如何在python中实现负二项式损失函数以用于轻型GBM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61426195/

相关文章:

python - 如何停止在我的 jupyter 实验室或笔记本中由面板启动的 Bokeh 服务器/应用程序? (不杀死我的内核)

python - 使用 adodbapi 在 python 中创建与 Vertica 数据库的连接

c# - 如何在 Windows 窗体 C# 中为文本框提供渐变颜色

python - C - 导入 Python 模块

tensorflow - tensorflow 中的简单 softmax 分类器

python - Python中基于字符串/整数序列的聚类和距离/相异矩阵

machine-learning - 机器学习中类别的用例

css - Flutter - 实现 CSS 径向渐变

android - SweepGradient Android - 如何设置渐变的起始角度

python - 为什么 `function` 不是 Python 中的关键字?