Classification multiclasse et log_loss

Sep 05 2020

J'espère que je peux clarifier cela avec quelques lignes de code / d'explication.

J'ai une liste de 16K de textes, étiquetés plus de 30 classes différentes qui ont été exécutées à travers différents classificateurs; ma prédiction et la vérité terrain correspondent en moyenne à 94%.

Je suis maintenant après avoir mesuré quelque chose de plus (je ne sais pas ce que je dois mesurer au-dessus d'un minimum de F1_score car j'apprends encore) et je suis tombé sur le log_loss de sklearn, ce qui, je le comprends, se situe entre 0 et 1. Quand contre ma prédiction, cependant, les résultats sont 1.48xxx, ce qui est en fait plus élevé.

En essayant de comprendre ce qui n'allait pas.

J'ai exploré le résultat de ComplementNB.predict_proba qui est requis pour le log_loss, et la valeur correspond à celle de mon tableau de prédiction.

Ci-dessous un code:

from sklearn.metrics import log_loss

y = ... # This is my array of value that is my source of truth

labels = numpy.unique(y)
label_ary = [idx for gt in y for idx, lbl in enumerate(labels) if gt == lbl]

print(f'The log loss is {log_loss(label_ary, clf.predict_proba(X.toarray()))}')

Que j'utilise label_ary ou y, dans les deux cas, j'obtiens la même valeur, ce qui signifie qu'une conversion à l'intérieur du log_loss est déjà en cours.

Je ne sais pas si cela me donne une mauvaise interprétation des résultats ou des spécificités de la fonction.

Qu'est-ce que je fais mal? Merci

Réponses

1 YuseqYaseq Sep 05 2020 at 22:17

Interprétabilité de la perte de journal

La perte de journal n'est pas nécessairement comprise entre la plage [0; 1] - il s'attend uniquement à ce que l'entrée soit dans cette plage. Jetez un œil à cet exemple:$$ y_{pred} = 0.1 \\ y_{true} = 1.0 \\ log\_loss = -(log(y_{pred}) * y_{true} + (1 - y_{true}) * log(1 - y_{pred})) = -(log(0.1) * 1.0) = 2.302 $$Dans un cas extrême, la perte de journal peut même être égale à l'infini. Il n'y a donc rien de mal avec le code et il n'y a pas non plus beaucoup de choses intéressantes que vous puissiez déduire du fait que log_loss est inférieur ou supérieur à 1. Ce que vous pouvez en faire est la même chose qu'avec n'importe quelle fonction de perte - comparez-le à un modèle similaire avec différents hyperparamètres et choisissez celui avec la perte moyenne la plus faible comme meilleur modèle (un processus appelé optimisation des hyperparamètres).

Quand utiliser la perte et quand le score f1?

Disons que vous avez un jeu de données et un problème de classification que vous souhaitez résoudre. Vous savez que vous pouvez créer un modèle statistique qui renvoie les probabilités d'une classe donnée. Vous savez également qu'il existe (hypothétiquement) un algorithme qui classe sur la base de certaines heuristiques qui ne nécessitent aucune formation. Vous aimeriez savoir lequel d'entre eux est le mieux adapté à votre problème. Ce que vous faites, si nous simplifions un peu, c'est:

  1. Divisez votre ensemble de données pour former, valider et tester des ensembles.
  2. Utilisez votre train pour entraîner le modèle
  3. Pendant l'entraînement, le modèle calcule la perte pour le train et l'ensemble de validation à chaque époque (si vous n'utilisez pas de réseaux de neurones profonds, vous pouvez et devez utiliser la validation croisée ).
  4. Tracez la perte pour le train et l'ensemble de validation et voyez si votre modèle est biaisé (perte de train élevée et perte de validation élevée) ou suréquipé (perte de train faible et perte de validation élevée). La perte de validation la plus faible, mieux c'est.
  5. Faites 3. et 4. plusieurs fois pour différents hyperparamètres et sélectionnez-en un avec la perte de jeu de validation la plus faible. Vous disposez maintenant d'un modèle statistique formé.
  6. Utilisez maintenant le score f1 pour comparer votre modèle à l'algorithme que vous connaissez également. Plus le score est élevé, mieux c'est. Notez qu'en supposant que l'algorithme renvoie des classes et non des probabilités s'il est incorrect même pour un exemple, sa fonction de perte de journal sera égale à l'infini. C'est pourquoi nous ne pouvons pas utiliser la perte de journal comme métrique pour comparer ces deux méthodes.

En bref, vous devez utiliser la perte comme mesure pendant le processus de formation / validation pour optimiser les paramètres et les hyperparamètres et le score f1 (et éventuellement beaucoup plus de mesures, par exemple la zone sous la courbe ) pendant le processus de test pour sélectionner la meilleure méthode pour résoudre votre problème. De cette façon, il est possible de comparer différentes méthodes pour résoudre le problème, même celles qui n'utilisent pas du tout l'apprentissage automatique.