Comprender predic_proba de MultiOutputClassifier

28

Estoy siguiendo este ejemplo en el sitio web scikit-learn para realizar una clasificación de múltiples salidas con un modelo de bosque aleatorio.

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 esto predict_probaobtengo 2 matrices de 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]])]

Realmente esperaba un n_sampleporn_classes matriz. Me cuesta entender cómo se relaciona esto con la probabilidad de las clases presentes.

Los documentos para los predict_probaestados:

matriz de forma = [n_muestras, n_clases], o una lista de n_salidas tales matrices si n_salidas> 1.

Las probabilidades de clase de las muestras de entrada. El orden de las clases corresponde al del atributo classes_.

Supongo que tengo lo último en la descripción, pero todavía me cuesta entender cómo se relaciona esto con las probabilidades de mi clase.

Además, cuando intento acceder al classes_atributo para el forestmodelo obtengo un AttributeErrory este atributo no existe en el MultiOutputClassifier. ¿Cómo puedo relacionar las clases con la salida?

print(forest.classes_)

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

Respuestas:

31

Suponiendo que su objetivo es (0,1), el clasificador generará una matriz de probabilidad de dimensión (N, 2). El primer índice se refiere a la probabilidad de que los datos pertenezcan a la clase 0, y el segundo se refiere a la probabilidad de que los datos pertenezcan a la clase 1.

Estos dos sumarían 1.

Luego puede generar el resultado de la siguiente manera:

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

Si tiene k clases, la salida sería (N, k), tendría que especificar la probabilidad de qué clase desea.

chrisckwong821
fuente
2
Si este es el caso, todavía estoy confundido sobre por qué hay dos columnas para cada clase. Si cada clase tiene su propia entrada, ¿no debería cada entrada ser una matriz (N, 1) para ilustrar la probabilidad de esa clase?
Harpal
2
dos columnas para dos clases, recuerde que cuando define el objetivo (0,1), hay dos clases. Cada fila / punto de datos requeriría una predicción tanto en 0 como en 1. Por ejemplo, el punto de datos1 tiene un 80% de probabilidad de pertenecer a 0, y un 20% de pertenecer a 1. la salida sería (0.8,0.2). necesita acceder a la predicción [:, 1] para obtener la segunda columna si desea la predicción para 1. En general, predicción de acceso [:, k] si desea verosimilitud de la clase k
chrisckwong821
1
Esto parece ignorar que la pregunta es sobre un modelo de salida múltiple.
Ben Reiniger
2

En el MultiOutputClassifier, estás tratando las dos salidas como tareas de clasificación separadas; de los documentos que vinculó:

Esta estrategia consiste en ajustar un clasificador por objetivo.

Entonces, las dos matrices en la lista resultante representan cada una de las dos clasificadores / variables dependientes. Las matrices son las salidas de clasificación binaria (columnas que son probabilidad de clase 0, probabilidad de clase 1) que @ chrisckwong821 mencionó, pero una para cada problema.

En otras palabras, el valor de retorno de predict_probaserá una lista cuya longitud es igual al ancho de su y, es decir n_outputs, en su caso 2. Su cita de las predict_probareferencias de documentación n_outputs, que se presenta en la documentación para fit:

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

y : (disperso) en forma de matriz, forma (n_samples, n_outputs)

Ben Reiniger
fuente
Estoy de acuerdo con tu comentario, la respuesta más votada no responde la pregunta, no explica por qué hay una serie de formas (N, 2). Su respuesta hace responder a la pregunta:n_outputs
La Red Pea
1
Gracias, me sorprendió encontrar la otra respuesta tan altamente votada. Y gracias por la edición!
Ben Reiniger
0

Para la primera pregunta:

La primera matriz de 5x2 le brinda las probabilidades de las 5 muestras de prueba clasificadas en la primera clase. Además, la primera columna de esta matriz de 5x2 le dice "la probabilidad de que la muestra de prueba no se clasifique como la primera clase" y la segunda columna de esta matriz de 5x2 le dice "la probabilidad de que la muestra de prueba se clasifique como la primera clase ".

Del mismo modo, la segunda matriz de 5x2 le brinda la probabilidad de clasificación de probar muestras en la segunda clase.

Si desea verificar esto, puede contrastar el valor en esas matrices con los resultados de predict .

A veces, el retorno de predict_probapodría darle una lista que contiene matrices Nx1 y matrices Nx2. Si es así, no se clasifican los datos de prueba en esas clases representadas de matrices Nx1.

johnhery
fuente