Comprendre predict_proba à partir de MultiOutputClassifier


28

Je suis cet exemple sur le site Web scikit-learn pour effectuer une classification multi-sorties avec un modèle de forêt aléatoire.

from sklearn.datasets import make_classification
from sklearn.multioutput import MultiOutputClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.utils import shuffle
import numpy as np

X, y1 = make_classification(n_samples=5, n_features=5, n_informative=2, n_classes=2, random_state=1)
y2 = shuffle(y1, random_state=1)
Y = np.vstack((y1, y2)).T

forest = RandomForestClassifier(n_estimators=10, random_state=1)
multi_target_forest = MultiOutputClassifier(forest, n_jobs=-1)
multi_target_forest.fit(X, Y).predict(X)

print(multi_target_forest.predict_proba(X))

De cela, predict_probaj'obtiens un 2 tableaux 5x2:

[array([[ 0.8,  0.2],
       [ 0.4,  0.6],
       [ 0.8,  0.2],
       [ 0.9,  0.1],
       [ 0.4,  0.6]]), array([[ 0.6,  0.4],
       [ 0.1,  0.9],
       [ 0.2,  0.8],
       [ 0.9,  0.1],
       [ 0.9,  0.1]])]

Je m'attendais vraiment à une matrice n_samplepar n_classes. J'ai du mal à comprendre comment cela se rapporte à la probabilité des classes présentes.

Les documents pour les predict_probaétats:

tableau de forme = [n_échantillons, n_classes], ou une liste de n_sorties de tels tableaux si n_sorties> 1.

Les probabilités de classe des échantillons d'entrée. L'ordre des classes correspond à celui de l'attribut classes_.

Je suppose que j'ai ce dernier dans la description, mais j'ai toujours du mal à comprendre comment cela se rapporte à mes probabilités de classe.

De plus, lorsque j'essaie d'accéder à l' classes_attribut du forestmodèle, j'obtiens un AttributeErroret cet attribut n'existe pas sur le MultiOutputClassifier. Comment relier les classes à la sortie?

print(forest.classes_)

AttributeError: 'RandomForestClassifier' object has no attribute 'classes_'

Réponses:


31

En supposant que votre cible est (0,1), le classificateur produirait une matrice de probabilité de dimension (N, 2). Le premier indice se réfère à la probabilité que les données appartiennent à la classe 0, et le second se réfère à la probabilité que les données appartiennent à la classe 1.

Ces deux résumeraient à 1.

Vous pouvez ensuite sortir le résultat en:

probability = model.predict_proba(X)[:,1]

Si vous avez k classes, la sortie serait (N, k), vous devrez spécifier la probabilité de quelle classe vous voulez.


2
Si tel est le cas, je ne comprends toujours pas pourquoi il y a deux colonnes pour chaque classe. Si chaque classe a sa propre entrée, chaque entrée ne devrait-elle pas être une matrice (N, 1) pour illustrer la probabilité de cette classe?
Harpal

2
deux colonnes pour deux classes, rappelez-vous que lorsque vous définissez la cible (0,1), il y a deux classes. Chaque ligne / point de données nécessiterait une prédiction à la fois sur 0 et 1. Par exemple, le point de données1 a 80% de chances d'appartenir à 0, et 20% à 1. la sortie serait (0,8,0,2). vous devez accéder à la prédiction [:, 1] pour obtenir la deuxième colonne si vous voulez la prédiction pour 1. En général, la prédiction d'accès [:, k] si vous voulez la probabilité de la k ème classe
chrisckwong821

1
Cela semble ignorer que la question concerne un modèle à sorties multiples.
Ben Reiniger

2

Dans le MultiOutputClassifier, vous traitez les deux sorties comme des tâches de classification distinctes; à partir des documents que vous avez liés:

Cette stratégie consiste à ajuster un classificateur par cible.

Ainsi, les deux tableaux de la liste résultante représentent chacun des deux classificateurs / variables dépendantes. Les tableaux sont alors les sorties de classification binaire (colonnes qui sont une probabilité de classe 0, une probabilité de classe 1) que @ chrisckwong821 a mentionnées, mais une pour chaque problème.

En d'autres termes, la valeur de retour de predict_probasera une liste dont la longueur est égale à la largeur de votre y, c'est n_outputs-à- dire dans votre cas 2. Votre citation des predict_probaréférences de la documentation n_outputs, qui est introduite dans la documentation pour fit:

fit(self, X, y[, sample_weight])

y : (clairsemé) de type tableau, forme (n_samples, n_outputs)


Je suis d'accord avec votre commentaire, la réponse la plus votée ne répond pas à la question, n'explique pas pourquoi il y a un tableau de (N, 2) formes. Votre réponse répond à la question:n_outputs
The Red Pea

1
Merci, j'ai été surpris de trouver l'autre réponse si fortement votée. Et merci pour le montage!
Ben Reiniger

0

Pour la première question:

Le premier tableau 5x2 vous donne les probabilités des 5 échantillons de test classés dans la première classe. De plus, la première colonne de ce tableau 5x2 vous indique "la probabilité que l'échantillon de test ne soit pas classé comme première classe" et la deuxième colonne de ce tableau 5x2 vous indique "la probabilité que l'échantillon de test soit classé comme première classe ".

De même, le deuxième tableau 5x2 vous donne la probabilité de classification de tester des échantillons dans la deuxième classe.

Si vous souhaitez vérifier cela, vous pouvez comparer la valeur de ces tableaux avec les résultats de predict .

Parfois, le retour de predict_probapeut vous donner une liste qui contient des tableaux Nx1 et des tableaux Nx2. Si tel est le cas, aucune donnée de test n'est classée dans les classes représentées par les tableaux Nx1.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.