Fonction de perte de déviance binomiale de Scikit

11

C'est la fonction de perte de déviance binomiale de scikit GradientBoosting,

   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))))

Cette fonction de perte n'est pas similaire entre la classe avec 0 et la classe avec 1. Quelqu'un peut-il expliquer comment cela est considéré comme OK.

Par exemple, sans poids d'échantillon, la fonction de perte pour la classe 1 est

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

vs pour la classe 0

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

L'intrigue de ces deux ne sont pas similaires en termes de coût. Quelqu'un peut-il m'aider à comprendre.

Kumaran
la source

Réponses:

17

Deux observations sont nécessaires pour comprendre cette implémentation.

La première est que ce predn'est pas une probabilité, c'est une cote de log.

Psklearnpred-2

yJournal(p)+(1-y)Journal(1-p)=Journal(1-p)+yJournal(p1-p)

p=eP1+eP1-p=11+eP1

Journal(1-p)=Journal(11+eP)=-Journal(1+eP)

et

Journal(p1-p)=Journal(eP)=P

Donc, au total, la déviance binomiale est égale à

yP-Journal(1+eP)

Quelle est l'équation sklearnutilisée.

Matthew Drury
la source
Merci. Si je remplace predpar log odds, la fonction de perte est uniforme pour les deux classes.
Kumaran
Cette même question m'est venue récemment. Je regardais gradientboostedmodels.googlecode.com/git/gbm/inst/doc/gbm.pdf page 10 où le gradient de la déviance est répertorié. Mais il semble que le gradient qu'ils montrent soit pour le log-lik et non pour le log-lik négatif. Est-ce correct - cela semble correspondre à votre explication ici?
B_Miner
1
@B_Miner le lien est rompu
GeneX
Merci beaucoup @Matthew Drury
Catbuilts