web-dev-qa-db-fra.com

Prédire des classes ou des probabilités de classe?

J'utilise actuellement H2O pour un ensemble de données de problème de classification. Je le teste avec H2ORandomForestEstimator Dans un environnement python 3.6. J'ai remarqué que les résultats de la méthode de prédiction donnaient des valeurs comprises entre 0 et 1 (je suppose que c'est la probabilité ).

Dans mon ensemble de données, l'attribut cible est numérique, c'est-à-dire que les valeurs True sont 1 et False les valeurs sont 0. Je me suis assuré que j'ai converti le type en catégorie pour l'attribut cible, j'obtenais toujours le même résultat.

Ensuite, j'ai modifié le code pour convertir la colonne cible en facteur en utilisant la méthode asfactor() sur le H2OFrame, il n'y a pas eu de changement sur le résultat.

Mais lorsque j'ai changé les valeurs de l'attribut cible en Vrai et Faux pour 1 et 0 respectivement, j'obtenais le résultat attendu (c'est-à-dire), la sortie était la classification plutôt que la probabilité.

  • Quelle est la bonne façon d'obtenir le résultat de prédiction classifié?
  • Si les probabilités sont les résultats des valeurs cibles numériques, comment puis-je les gérer en cas de classification multiclasse?
10
Rahul

En principe et en théorie, la classification dure et douce (c'est-à-dire renvoyant les classes et probabilités respectivement) sont des approches différentes, chacune ayant ses propres avantages et inconvénients . Considérez par exemple ce qui suit, tiré de l'article Classification dure ou souple? Machines unifiées à grande marge :

Les classificateurs basés sur les marges ont été populaires à la fois dans l'apprentissage automatique et dans les statistiques pour les problèmes de classification. Parmi les nombreux classificateurs, certains sont des classificateurs durs tandis que certains sont doux . Les classificateurs logiciels estiment explicitement les probabilités conditionnelles de classe, puis effectuent une classification basée sur les probabilités estimées. En revanche, les classificateurs rigides ciblent directement la limite de décision de classification sans produire d'estimation de probabilité. Ces deux types de classificateurs sont basés sur des philosophies différentes et chacun a ses propres mérites.

Cela dit, dans la pratique, la plupart des classificateurs utilisés aujourd'hui, y compris Random Forest (la seule exception à laquelle je peux penser est la famille SVM) sont en fait des classificateurs souples : ce qu'ils produisent réellement en dessous est une mesure de probabilité, qui par la suite, combinée avec un seuil implicite (généralement 0,5 par défaut dans le cas binaire), donne une appartenance à une classe dure comme 0/1 ou True/False.

Quelle est la bonne façon d'obtenir le résultat de prédiction classifié?

Pour commencer, il est toujours possible de passer des probabilités aux classes dures, mais l'inverse n'est pas vrai.

D'une manière générale, et étant donné que votre classificateur est en fait un soft , obtenant juste les classifications dures de fin (True/False) donne une saveur de "boîte noire" au procédé, qui en principe ne devrait pas être souhaitable; manipuler directement les probabilités produites, et (important!) contrôler explicitement le seuil de décision devrait être la voie préférable ici. D'après mon expérience, ce sont des subtilités qui sont souvent perdues pour les nouveaux pratiquants; considérons par exemple ce qui suit, à partir du fil de validation croisée seuil de probabilité de classification :

la composante statistique de votre exercice se termine lorsque vous produisez une probabilité pour chaque classe de votre nouvel échantillon. Le choix d'un seuil au-delà duquel vous classifiez une nouvelle observation comme 1 vs 0 ne fait plus partie des statistiques . Il fait partie du composant décision .

Hormis les arguments "mous" (jeu de mots non intentionnels) comme ci-dessus, il y a des cas où vous avez besoin pour gérer directement les probabilités et les seuils sous-jacents, c'est-à-dire les cas où le seuil par défaut de 0,5 dans la classification binaire vous égarera, notamment lorsque vos classes sont déséquilibrées; voir ma réponse dans ASC élevée mais mauvaises prédictions avec des données déséquilibrées (et les liens qui s'y trouvent) pour un exemple concret d'un tel cas.

Pour être honnête, je suis plutôt surpris par le comportement de H2O que vous signalez (je ne l'ai pas utilisé personnellement), c'est-à-dire que le type de sortie est affecté par la représentation de l'entrée; cela ne devrait pas être le cas, et si c'est le cas, nous pouvons avoir un problème de mauvaise conception. Comparez par exemple le classificateur Random Forest dans scikit-learn, qui comprend deux méthodes différentes, predict et predict_proba , pour obtenir respectivement les classifications dures et les probabilités sous-jacentes (et en vérifiant les documents, la sortie de predict est basée sur les estimations de probabilité , qui ont déjà été calculés auparavant).

Si les probabilités sont les résultats des valeurs cibles numériques, comment puis-je les gérer en cas de classification multiclasse?

Il n'y a rien de nouveau ici en principe, à part le fait qu'un simple seuil n'a plus de sens; encore une fois, à partir de la forêt aléatoire predict docs dans scikit-learn:

la classe prédite est celle avec l'estimation de probabilité moyenne la plus élevée

Autrement dit, pour 3 classes (0, 1, 2), vous obtenez une estimation de [p0, p1, p2] (avec des éléments se résumant à un, selon les règles de probabilité), et la classe prédite est celle avec la probabilité la plus élevée, par ex. classe # 1 pour le cas de [0.12, 0.60, 0.28]. Voici un exemple reproductible avec le jeu de données iris à 3 classes (c'est pour l'algorithme GBM et dans R, mais la justification est la même).

12
desertnaut

Ajout à la réponse de @ desertnaut, et puisque vous avez marqué cette question comme Python, voici comment vous gérez la dernière partie de votre question:

Si les probabilités sont les résultats des valeurs cibles numériques, comment puis-je les gérer en cas de classification multiclasse?

y_pred = np.argmax(prob, axis=1)

Cela convertira un (num_examples, n_classes) tableau de valeurs de probabilité à un (num_examples, ) tableau de classes prédites.

3
doodhwala