Zrozumienie prognozy_proba z MultiOutputClassifier

28

Podążam za tym przykładem na stronie scikit-learn, aby przeprowadzić klasyfikację wielu wyników za pomocą modelu Random Forest.

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))

Z tego predict_probaotrzymuję 2 tablice 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]])]

Byłem naprawdę spodziewa się n_sampleprzez n_classesmatrycę. Próbuję zrozumieć, w jaki sposób odnosi się to do prawdopodobieństwa obecności klas.

W docs dla predict_probastanów:

tablica shape = [n_samples, n_classes] lub lista n_outputs takich tablic, jeśli n_outputs> 1.

Prawdopodobieństwa klasowe próbek wejściowych. Kolejność klas odpowiada kolejności w atrybucie klas_.

Chyba mam to drugie w opisie, ale wciąż staram się zrozumieć, w jaki sposób odnosi się to do prawdopodobieństwa mojej klasy.

Ponadto, gdy próbuję uzyskać dostęp do classes_atrybutu forestmodelu, otrzymuję AttributeErrori ten atrybut nie istnieje na MultiOutputClassifier. Jak mogę powiązać klasy z danymi wyjściowymi?

print(forest.classes_)

AttributeError: 'RandomForestClassifier' object has no attribute 'classes_'
Harpal
źródło

Odpowiedzi:

31

Zakładając, że twoim celem jest (0,1), wtedy klasyfikator wyprowadziłby macierz prawdopodobieństwa wymiaru (N, 2). Pierwszy indeks odnosi się do prawdopodobieństwa, że ​​dane należą do klasy 0, a drugi do prawdopodobieństwa, że ​​dane należą do klasy 1.

Te dwa sumują się do 1.

Następnie możesz wydrukować wynik:

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

Jeśli masz k klas, wynikiem będzie (N, k), musisz określić prawdopodobieństwo, której klasy chcesz.

chrisckwong821
źródło
2
Jeśli tak jest, nadal jestem zdezorientowany, dlaczego istnieją dwie kolumny dla każdej klasy. Jeśli każda klasa ma swój własny wpis, czy nie powinna ona być macierzą (N, 1) ilustrującą prawdopodobieństwo tej klasy?
Harpal
2
dwie kolumny dla dwóch klas, pamiętaj, że kiedy definiujesz cel (0,1), istnieją dwie klasy. Każdy wiersz / punkt danych wymagałby prognozy zarówno dla 0, jak i 1. Na przykład datapoint1 ma 80% prawdopodobieństwa przynależności do 0, a 20% przynależy do 1. wynik byłby (0,8,0,2). musisz uzyskać dostęp do prediciton [:, 1], aby uzyskać drugą kolumnę, jeśli chcesz przewidywać dla 1. Ogólnie przewidywanie dostępu [:, k], jeśli chcesz prawdopodobieństwa klasy k
chrisckwong821
1
To wydaje się ignorować fakt, że pytanie dotyczy modelu z wieloma wyjściami.
Ben Reiniger,
2

W MultiOutputClassifiertraktujesz dwa wyniki jako oddzielne zadania klasyfikacji; z połączonych dokumentów:

Ta strategia polega na dopasowaniu jednego klasyfikatora do celu.

Zatem dwie tablice na wynikowej liście reprezentują każdy z dwóch klasyfikatorów / zmiennych zależnych. Tablice są zatem wyjściowymi klasyfikacjami binarnymi (kolumny, które są prawdopodobieństwem klasy 0, prawdopodobieństwem klasy 1), o których wspomniał @ chrisckwong821, ale po jednym dla każdego problemu.

Innymi słowy, zwracana wartość predict_probabędzie listą, której długość jest równa szerokości twojej y, tj. n_outputsW twoim przypadku 2. Twój cytat z predict_probaodniesień do dokumentacji n_outputs, który jest wprowadzony w dokumentacji dla fit:

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

y : (rzadki) podobny do tablicy, kształt (n_samples, n_outputs)

Ben Reiniger
źródło
Zgadzam się z twoim komentarzem, najbardziej pozytywna odpowiedź nie odpowiada na pytanie, nie wyjaśnia, dlaczego istnieje szereg (N, 2) kształtów. Twoja odpowiedź ma odpowiedzieć na pytanie:n_outputs
Red Pea
1
Dzięki, byłem zaskoczony, gdy znalazłem inną odpowiedź, która została tak wysoko głosowana. I dzięki za edycję!
Ben Reiniger,
0

Pierwsze pytanie:

Pierwsza tablica 5x2 daje prawdopodobieństwa 5 próbek testowych sklasyfikowanych w pierwszej klasie. Ponadto pierwsza kolumna tej tablicy 5x2 mówi „prawdopodobieństwo, że próbka testowa nie zostanie sklasyfikowana jako pierwsza klasa”, a druga kolumna tej tablicy 5x2 mówi „prawdopodobieństwo, że próbka testowa zostanie sklasyfikowana jako pierwsza klasa „.

Podobnie, druga tablica 5x2 daje prawdopodobieństwo klasyfikacji testowania próbek w drugiej klasie.

Jeśli chcesz to sprawdzić, możesz porównać wartość w tych tablicach z wynikami z predict.

Czasami powrót wartości predict_probamoże dać listę zawierającą tablice Nx1 i tablice Nx2. Jeśli tak, żadne dane testowe nie są klasyfikowane do tych reprezentowanych klas tablic Nx1.

johnhery
źródło