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_proba
obtengo 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_sample
porn_classes
matriz. Me cuesta entender cómo se relaciona esto con la probabilidad de las clases presentes.
Los documentos para los predict_proba
estados:
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 forest
modelo obtengo un AttributeError
y 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_proba
será una lista cuya longitud es igual al ancho de suy
, es decirn_outputs
, en su caso 2. Su cita de laspredict_proba
referencias de documentaciónn_outputs
, que se presenta en la documentación parafit
:fuente
n_outputs
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_proba
podrí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