Как реализовать отрицательную функцию биномиальных потерь в python для использования в легких GBM? - PullRequest
2 голосов
/ 25 апреля 2020

У меня проблема с машинным обучением, и я считаю, что функция отрицательной биномиальной потери хорошо подойдет, но в пакете light gbm ее нет в качестве стандарта, я пытаюсь ее реализовать, но я не знаете, как получить градиент и гессиан, кто-нибудь знает, как я могу это сделать? Мне удалось добраться до функции потерь, но я не могу добраться до градиента и гессиана.

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

Теперь, как получить градиент и гессиан?

def custom_asymmetric_train(y_pred,y_true):
    residual = (y_true.get_label() - y_pred).astype("float")

    grad = ?
    hess = ?

    return grad, hess

Кто-нибудь мог помощь

1 Ответ

2 голосов
/ 25 апреля 2020

это возможно с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...