MultiOutputClassifier'dan predict_proba'yı anlama


28

Bu örneği , Random Forest modeli ile çoklu işlem sınıflandırma yapmak için, scikit-learn web sitesinde takip ediyorum .

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

Bundan predict_proba2 5x2 dizi alıyorum:

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

Gerçekten bekliyordum n_sampletarafından n_classesmatrisinin. Bunun mevcut sınıfların olasılığı ile nasıl ilişkili olduğunu anlamakta güçlük çekiyorum.

Docs için predict_probadevletler:

shape dizisi = [n_samples, n_classes] veya n_outputs> 1 ise bu dizilerin n_outputs listesi.

Girdi örneklerinin sınıf olasılıkları. Sınıfların sırası, sınıflar_ özniteliğindeki ile aynıdır.

Sanırım açıklamasında ikinciye sahibim, ancak bunun sınıf olasılıklarımla nasıl bir ilgisi olduğunu anlamak için hala mücadele ediyorum.

Ayrıca, modelin classes_özniteliğine erişmeye çalıştığımda, forestalıyorum AttributeErrorve bu öznitelik üzerinde yok MultiOutputClassifier. Sınıfları çıktıyla nasıl ilişkilendirebilirim?

print(forest.classes_)

AttributeError: 'RandomForestClassifier' object has no attribute 'classes_'

Yanıtlar:


31

Hedefinizin (0,1) olduğunu varsayarsak, sınıflandırıcı boyut olasılık olasılık matrisini (N, 2) çıkarır. İlk endeks, verinin sınıf 0'a ait olma olasılığını ifade ederken, ikincisi verinin sınıf 1'e ait olma olasılığını ifade eder.

Bu ikisi 1'e toplanır.

Daha sonra sonucu şöyle yazdırabilirsiniz:

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

K sınıfınız varsa, çıktı (N, k) olur, istediğiniz sınıfın olasılığını belirtmeniz gerekir.


2
Bu durumda, neden her sınıf için iki sütun bulunduğuna dair kafam karıştı. Her sınıfın kendi girişi varsa, her giriş o sınıfın olasılığını göstermek için bir (N, 1) matris olmamalıdır?
Harpal

2
İki sınıf için iki sütun, hedefi tanımlarken (0,1), iki sınıf olduğunu hatırlayın. Her satır / veri noktası, hem 0 hem de 1 için bir tahmin gerektirecektir. Örneğin, veri noktası1, 0'a ait olma ihtimalinin% 80'ine ve% 1'ine ait olanın% 20'sinin çıktısına sahip olacaktır (0.8,0.2). Eğer 1 için öngörüde bulunmak istiyorsanız ikinci sütunu almak için prediciton [:, 1] 'e erişmeniz gerekir. Genel erişim tahmini [:, k]' da,
kinci

1
Bu, sorunun çok çıkışlı bir modelle ilgili olduğunu görmezden geliyor gibi görünüyor.
Ben Reiniger

2

Bu MultiOutputClassifieriki çıktıyı ayrı sınıflandırma görevleri olarak görüyorsunuz; Bağladığınız dokümanlardan:

Bu strateji, hedef başına bir sınıflandırıcının yerleştirilmesinden ibarettir.

Sonuçta ortaya çıkan listedeki iki dizi, iki sınıflandırıcı / bağımlı değişkeni temsil eder. Diziler daha sonra bahsi geçen @ chrisckwong821, ancak her problem için bir tane olan ikili sınıflandırma çıktılarıdır (0 sınıfının olasılığı olan sütunlar, sınıf 1'in olasılığı).

Başka bir deyişle, dönüş değeri predict_probauzunluğu sizin genişliğine eşit bir liste olacak y, yani n_outputs, senin Gönder 2. senin durumunda gelen predict_probadokümantasyon referanslar n_outputsdokümantasyon için arz edilir olup fit:

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

y : (seyrek) dizi benzeri, şekil (n_samples, n_outputs)


Yorumunuza katılıyorum, en çok oy alan cevap soruyu cevaplamıyor, neden bir dizi (N, 2) şekil olduğunu açıklamıyor . Yanıtınız yapar : soruya cevapn_outputs
Kırmızı Bezelye

1
Teşekkürler, bu kadar yüksek oyu alan diğer cevabı bulduğumda şaşırdım. Ve düzenleme için teşekkürler!
Ben Reiniger

0

İlk soru için:

İlk 5x2 dizisi, size birinci sınıfta sınıflandırılmış 5 test örneğinin olasılıklarını verir. Ek olarak, bu 5x2 dizisinin ilk sütunu "test numunesinin birinci sınıf olarak sınıflandırılma olasılığını" ve bu 5x2 dizisinin ikinci sütunu "size test numunesinin birinci sınıf olarak sınıflandırılma olasılığını" bildirir ".

Benzer şekilde, ikinci 5x2 dizisi, ikinci sınıftaki örneklerin test edilme olasılığını verir.

Bunu kontrol etmek istiyorsanız, bu dizilerdeki değeri sonuçları ile karşılaştırabilirsiniz predict.

Bazen, dönüşü predict_probasize Nx1 dizileri ve Nx2 dizileri içeren bir liste verebilir. Eğer öyleyse, hiçbir test verisi, temsil edilen sınıfları Nx1 dizilerine sınıflandırmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.