Understanding predict_proba von MultiOutputClassifier

28

Ich folge diesem Beispiel auf der Website von scikit-learn, um eine Multi-Output-Klassifizierung mit einem Random Forest-Modell durchzuführen.

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

Daraus predict_probaerhalte ich 2 5x2 Arrays:

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

Ich erwarte wirklich ein n_samplevon n_classesMatrix. Ich kämpfe darum zu verstehen, wie dies mit der Wahrscheinlichkeit der anwesenden Klassen zusammenhängt.

Die Dokumente für predict_probaStaaten:

array of shape = [n_samples, n_classes] oder eine Liste von n_outputs solcher Arrays, wenn n_outputs> 1.

Die Klassenwahrscheinlichkeiten der Eingabebeispiele. Die Reihenfolge der Klassen entspricht der im Attribut classes_.

Ich schätze, ich habe das letztere in der Beschreibung, aber ich habe immer noch Schwierigkeiten zu verstehen, wie dies mit meinen Klassenwahrscheinlichkeiten zusammenhängt.

Wenn ich versuche, auf das classes_Attribut für das forestModell zuzugreifen, erhalte ich außerdem eine AttributeErrorund dieses Attribut ist auf der nicht vorhanden MultiOutputClassifier. Wie kann ich die Klassen mit der Ausgabe verknüpfen?

print(forest.classes_)

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

Antworten:

31

Angenommen, Ihr Ziel ist (0,1), dann würde der Klassifikator eine Wahrscheinlichkeitsmatrix der Dimension (N, 2) ausgeben. Der erste Index bezieht sich auf die Wahrscheinlichkeit, dass die Daten zur Klasse 0 gehören, und der zweite auf die Wahrscheinlichkeit, dass die Daten zur Klasse 1 gehören.

Diese beiden würden zu 1 summieren.

Sie können das Ergebnis dann ausgeben, indem Sie:

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

Wenn Sie k Klassen haben, wäre die Ausgabe (N, k), Sie müssten die Wahrscheinlichkeit angeben, für welche Klasse Sie möchten.

chrisckwong821
quelle
2
Wenn dies der Fall ist, bin ich immer noch verwirrt, warum es für jede Klasse zwei Spalten gibt. Wenn jede Klasse einen eigenen Eintrag hat, sollte nicht jeder Eintrag eine (N, 1) Matrix sein, um die Wahrscheinlichkeit dieser Klasse darzustellen?
Harpal
2
In zwei Spalten für zwei Klassen wird daran erinnert, dass beim Definieren des Ziels (0,1) zwei Klassen vorhanden sind. Jede Zeile / jeder Datenpunkt würde eine Vorhersage sowohl für 0 als auch für 1 erfordern. Zum Beispiel hat Datenpunkt1 eine Wahrscheinlichkeit von 80%, zu 0 zu gehören, und 20%, zu 1 zu gehören. Die Ausgabe wäre (0,8,0,2). Sie müssen Zugang prediciton [: 1] die zweite Säule erhalten , wenn u die Prognose für 1. Im allgemeinen Zugang Vorhersage will [:, k] , wenn Sie Wahrscheinlichkeit , dass die k wollen th Klasse
chrisckwong821
1
Dies scheint zu ignorieren, dass es sich um ein Multi-Output-Modell handelt.
Ben Reiniger
2

In der MultiOutputClassifierbehandeln Sie die beiden Ausgaben als separate Klassifizierungsaufgaben. aus den von Ihnen verlinkten Dokumenten:

Diese Strategie besteht darin, einen Klassifikator pro Ziel anzupassen.

Die zwei Arrays in der resultierenden Liste repräsentieren also jeden der beiden Klassifizierer / abhängigen Variablen. Die Arrays sind dann die binären Klassifizierungsausgaben (Spalten, die Wahrscheinlichkeit der Klasse 0, Wahrscheinlichkeit der Klasse 1 sind), die @ chrisckwong821 erwähnte, aber eine für jedes Problem.

Mit anderen Worten, der Rückgabewert von predict_probaist eine Liste, deren Länge der Breite Ihrer y, dh n_outputsin Ihrem Fall 2, entspricht. Ihr Zitat aus den predict_probaDokumentationsreferenzen n_outputs, das in der Dokumentation für Folgendes eingeführt wird fit:

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

y : (spärliche) Array-Form (n_samples, n_outputs)

Ben Reiniger
quelle
Ich stimme Ihrem Kommentar zu, die am häufigsten gewählte Antwort beantwortet die Frage nicht und erklärt nicht, warum es eine Reihe von (N, 2) Formen gibt. Ihre Antwort hat die Frage beantworten:n_outputs
The Red Pea
1
Vielen Dank, ich war überrascht, die andere Antwort so hoch bewertet zu finden. Und danke für die Bearbeitung!
Ben Reiniger
0

Für die erste Frage:

Das erste 5x2-Array gibt Ihnen die Wahrscheinlichkeiten der 5 Testproben an, die in der ersten Klasse klassifiziert sind. Darüber hinaus gibt die erste Spalte dieses 5 x 2-Arrays an, "wie wahrscheinlich es ist, dass das Testmuster nicht als erste Klasse eingestuft wird", und die zweite Spalte dieses 5 x 2-Arrays gibt an, "wie wahrscheinlich es ist, dass das Testmuster als erste Klasse eingestuft wird ".

In ähnlicher Weise gibt Ihnen das zweite 5x2-Array die Klassifizierungswahrscheinlichkeit für das Testen von Stichproben in der zweiten Klasse.

Wenn Sie dies überprüfen möchten, können Sie den Wert in diesen Arrays mit den Ergebnissen von kontrastieren predict.

In predict_probaeinigen Fällen erhalten Sie bei der Rückkehr von möglicherweise eine Liste mit Nx1-Arrays und Nx2-Arrays. Wenn dies der Fall ist, werden keine Testdaten in die Nx1-Arrays klassifiziert, die Klassen darstellen.

Johnhery
quelle