Entendendo o forecast_proba do MultiOutputClassifier

28

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_samplepor n_classesmatriz. Estou lutando para entender como isso se relaciona com a probabilidade das aulas presentes.

Os documentos para predict_probaestados:

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 forestmodelo, recebo um AttributeErrore 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_'
Harpal
fonte

Respostas:

31

Supondo que seu objetivo seja (0,1), o classificador produziria uma matriz de probabilidade de dimensão (N, 2). O primeiro índice refere-se à probabilidade de os dados pertencerem à classe 0 e o segundo refere-se à probabilidade de os dados pertencerem à classe 1.

Esses dois somariam 1.

Você pode gerar o resultado da seguinte maneira:

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

Se você tem k classes, a saída seria (N, k), você teria que especificar a probabilidade de qual classe deseja.

chrisckwong821
fonte
2
Se for esse o caso, ainda estou confuso sobre o motivo pelo qual existem duas colunas para cada classe. Se cada classe tem sua própria entrada, cada entrada não deve ser uma matriz (N, 1) para ilustrar a probabilidade dessa classe?
Harpal 5/17
2
duas colunas para duas classes, lembre-se de que ao definir o destino (0,1), existem duas classes. Cada linha / ponto de dados exigiria uma previsão em 0 e 1. Por exemplo, o ponto de dados1 tem 80% de probabilidade de pertencer a 0 e 20% de 1. a saída seria (0.8,0.2). você precisa de acesso prediciton [:, 1] para obter a segunda coluna se vc quiser a previsão para 1. Na previsão acesso geral [:, k] se quiser probabilidade da k th classe
chrisckwong821
11
Isso parece ignorar que a pergunta é sobre um modelo de várias saídas.
Ben Reiniger 22/07
2

No MultiOutputClassifier, você está tratando as duas saídas como tarefas de classificação separadas; dos documentos que você vinculou:

Essa estratégia consiste em ajustar um classificador por destino.

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_probaserá uma lista cujo comprimento seja igual à largura do seu y, ou seja n_outputs, no seu caso 2. Sua citação das predict_probareferências da documentação n_outputs, que é introduzida na documentação para fit:

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

y : (esparso) em forma de matriz (n_samples, n_outputs)

Ben Reiniger
fonte
Concordo com o seu comentário, a resposta mais votada não responde à pergunta, não explica por que existe uma matriz de (N, 2) formas. A sua resposta não responder à pergunta:n_outputs
A Red Pea
11
Obrigado, fiquei surpreso ao encontrar a outra resposta tão votada. E obrigado pela edição!
Ben Reiniger
0

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_probapode fornecer uma lista que contém matrizes Nx1 e matrizes Nx2. Nesse caso, nenhum dado de teste é classificado nessas classes representadas por matrizes Nx1.

joalheria
fonte