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_'

En el
MultiOutputClassifier, estás tratando las dos salidas como tareas de clasificación separadas; de los documentos que vinculó: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 suy, es decirn_outputs, en su caso 2. Su cita de laspredict_probareferencias de documentaciónn_outputs, que se presenta en la documentación parafit:fuente
n_outputsPara 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.fuente