Función de pérdida de desviación binomial de Scikit

11

Esta es la función de pérdida de desviación binomial de GradientBoosting de scikit,

   def __call__(self, y, pred, sample_weight=None):
        """Compute the deviance (= 2 * negative log-likelihood). """
        # logaddexp(0, v) == log(1.0 + exp(v))
        pred = pred.ravel()
        if sample_weight is None:
            return -2.0 * np.mean((y * pred) - np.logaddexp(0.0, pred))
        else:
            return (-2.0 / sample_weight.sum() *
                    np.sum(sample_weight * ((y * pred) - np.logaddexp(0.0, pred))))

Esta pérdida de funciones no es similar entre la clase con 0 y la clase con 1. ¿Alguien puede explicar cómo esto se considera correcto?

Por ejemplo, sin peso de muestra, la función de pérdida para la clase 1 es

-2(pred - log(1 + exp(pred))

vs para la clase 0

-2(-log(1+exp(pred))

La trama de estos dos no es similar en términos de costo. ¿Alguien puede ayudarme a entender?

Kumaran
fuente

Respuestas:

17

Se necesitan dos observaciones para comprender esta implementación.

La primera es que nopred es una probabilidad, es una probabilidad de registro.

El segundo es una manipulación algebraica estándar de la desviación binomial que va así. Sea las probabilidades de registro, lo que llama . Entonces la definición de la desviación binomial de una observación es (hasta un factor de )Psklearnpred2

ylog(p)+(1y)log(1p)=log(1p)+ylog(p1p)

Ahora observe que y (una comprobación rápida es sumarlos en tu cabeza, obtendrás ). Entoncesp=eP1+eP1p=11+eP1

log(1p)=log(11+eP)=log(1+eP)

y

log(p1p)=log(eP)=P

Entonces, en conjunto, la desviación binomial es igual a

yPlog(1+eP)

¿Cuál es la ecuación que sklearnestá usando?

Matthew Drury
fuente
Gracias. Si lo reemplazo predcon probabilidades de registro, la función de pérdida es uniforme para ambas clases.
Kumaran
Esta misma pregunta me surgió recientemente. Estuve mirando la página 10 de gradientboostedmodels.googlecode.com/git/gbm/inst/doc/gbm.pdf donde se enumera el gradiente de la desviación. Pero parece que el gradiente que muestran es para el log-lik no para el log-lik negativo. ¿Es correcto? ¿Parece coincidir con su explicación aquí?
B_Miner
1
@B_Miner el enlace está roto
GeneX
Muchas gracias @Matthew Drury
Catbuilts