Estou seguindo este exemplo no site scikit-learn para executar uma classificação de saída múltipla com um modelo de floresta aleatória.
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))
A partir disso predict_proba
, recebo duas matrizes 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]])]
Eu estava realmente esperando um n_sample
por n_classes
matriz. Estou lutando para entender como isso se relaciona com a probabilidade das aulas presentes.
Os documentos para predict_proba
estados:
array of shape = [n_samples, n_classes] ou uma lista de n_outputs como matrizes se n_outputs> 1.
As probabilidades de classe das amostras de entrada. A ordem das classes corresponde à do atributo classes_.
Acho que tenho o último na descrição, mas ainda estou lutando para entender como isso se relaciona com as probabilidades de minha classe.
Além disso, quando tento acessar o classes_
atributo para o forest
modelo, recebo um AttributeError
e esse atributo não existe no MultiOutputClassifier
. Como posso relacionar as classes com a saída?
print(forest.classes_)
AttributeError: 'RandomForestClassifier' object has no attribute 'classes_'
No
MultiOutputClassifier
, você está tratando as duas saídas como tarefas de classificação separadas; dos documentos que você vinculou:Portanto, as duas matrizes na lista resultante representam cada um dos dois classificadores / variáveis dependentes. As matrizes são as saídas de classificação binária (colunas com probabilidade da classe 0, probabilidade da classe 1) mencionadas pelo @ chrisckwong821, mas uma para cada problema.
Em outras palavras, o valor de retorno de
predict_proba
será uma lista cujo comprimento seja igual à largura do seuy
, ou sejan_outputs
, no seu caso 2. Sua citação daspredict_proba
referências da documentaçãon_outputs
, que é introduzida na documentação parafit
:fonte
n_outputs
Para a primeira pergunta:
A primeira matriz 5x2 fornece as probabilidades das 5 amostras de teste classificadas na primeira classe. Além disso, a primeira coluna desta matriz 5x2 indica "a probabilidade de a amostra de teste não ser classificada como a primeira classe" e a segunda coluna dessa matriz 5x2 indica "a probabilidade de a amostra de teste ser classificada como a primeira classe "
Da mesma forma, a segunda matriz 5x2 fornece a probabilidade de classificação de testar amostras na segunda classe.
Se você quiser verificar isso, poderá contrastar o valor nessas matrizes com os resultados de
predict
.Às vezes, o retorno de
predict_proba
pode fornecer uma lista que contém matrizes Nx1 e matrizes Nx2. Nesse caso, nenhum dado de teste é classificado nessas classes representadas por matrizes Nx1.fonte