Comprensione di predict_proba da MultiOutputClassifier


28

Sto seguendo questo esempio sul sito Web di scikit-learn per eseguire una classificazione multioutput con un modello Random Forest.

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

Da questo predict_probaottengo 2 matrici 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]])]

Ero veramente mi aspettavo una n_sampleda n_classesMatrix. Faccio fatica a capire come ciò si collega alla probabilità delle classi presenti.

I documenti per gli predict_probastati:

array of shape = [n_samples, n_classes] o un elenco di n_outputs tali array se n_outputs> 1.

Le probabilità di classe dei campioni di input. L'ordine delle classi corrisponde a quello nell'attributo classi_.

Immagino di avere quest'ultimo nella descrizione, ma sto ancora lottando per capire come questo si collega alle mie probabilità di classe.

Inoltre, quando provo ad accedere classes_all'attributo per il forestmodello ottengo un AttributeErrore questo attributo non esiste sul MultiOutputClassifier. Come posso collegare le classi all'output?

print(forest.classes_)

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

Risposte:


31

Supponendo che il tuo obiettivo sia (0,1), il classificatore produrrebbe una matrice di probabilità di dimensione (N, 2). Il primo indice si riferisce alla probabilità che i dati appartengano alla classe 0 e il secondo si riferisce alla probabilità che i dati appartengano alla classe 1.

Questi due sarebbero pari a 1.

È quindi possibile generare il risultato come segue:

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

Se hai k classi, l'output sarebbe (N, k), dovresti specificare la probabilità di quale classe desideri.


2
Se questo è il caso, sono ancora confuso sul perché ci sono due colonne per ogni classe. Se ogni classe ha una propria voce, ogni voce non dovrebbe essere una matrice (N, 1) per illustrare la probabilità di quella classe?
Harpal,

2
due colonne per due classi, ricorda che quando si definisce il target (0,1), ci sono due classi. Ogni riga / punto dati richiederebbe una previsione sia su 0 che su 1. Ad esempio il punto dati1 ha l'80% di probabilità di appartenere a 0 e il 20% di appartenenza a 1. l'uscita sarebbe (0.8,0.2). è necessario accedere al prediciton [:, 1] per ottenere la seconda colonna se si desidera la previsione per 1. Nella previsione di accesso generale [:, k] se si desidera la probabilità della classe k th
chrisckwong821

1
Questo sembra ignorare che la domanda riguarda un modello multi-output.
Ben Reiniger,

2

Nel MultiOutputClassifier, stai trattando i due output come attività di classificazione separate; dai documenti che hai collegato:

Questa strategia consiste nell'adattare un classificatore per target.

Quindi i due array nell'elenco risultante rappresentano ciascuna delle due classificatori / variabili dipendenti. Le matrici quindi sono le uscite della classificazione binaria (colonne che sono probabilità di classe 0, probabilità di classe 1) che @ chrisckwong821 ha menzionato, ma una per ogni problema.

In altre parole, il valore di ritorno di predict_probasarà un elenco la cui lunghezza è uguale alla larghezza del tuo y, cioè n_outputsnel tuo caso 2. Il tuo preventivo dai predict_probariferimenti della documentazione n_outputs, che è introdotto nella documentazione per fit:

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

y : (sparsa) simile a matrice, forma (n_samples, n_outputs)


Sono d'accordo con il tuo commento, la risposta più votata non risponde alla domanda, non spiega perché esiste una matrice di (N, 2) forme. La tua risposta non rispondere alla domanda:n_outputs
The Red Pea

1
Grazie, sono stato sorpreso di trovare l'altra risposta così votata. E grazie per la modifica!
Ben Reiniger,

0

Per la prima domanda:

Il primo array 5x2 offre le probabilità dei 5 campioni di test classificati nella prima classe. Inoltre, la prima colonna di questo array 5x2 indica "la probabilità che il campione di test non sia classificato come prima classe" e la seconda colonna di questo array 5x2 indica "la probabilità che il campione di test sia classificato come prima classe ".

Allo stesso modo, il secondo array 5x2 offre la probabilità di classificazione dei test dei campioni nella seconda classe.

Se si desidera verificare ciò, è possibile contrastare il valore di tali array con i risultati di predict.

A volte, il ritorno di predict_probapotrebbe darti un elenco che contiene array Nx1 e array Nx2. In tal caso, nessun dato di test è classificato nelle classi rappresentate di array Nx1.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.