Memahami predict_proba dari MultiOutputClassifier

28

Saya mengikuti contoh ini di situs scikit-learn untuk melakukan klasifikasi multioutput dengan model 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))

Dari ini predict_probasaya mendapatkan 2 array 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]])]

Saya benar-benar mengharapkan n_sampleoleh n_classesmatriks. Saya berjuang untuk memahami bagaimana ini berhubungan dengan probabilitas kelas yang ada.

The docs untuk predict_probanegara:

array of shape = [n_samples, n_classes], atau daftar n_outputs array tersebut jika n_outputs> 1.

Probabilitas kelas dari sampel input. Urutan kelas sesuai dengan yang ada di atribut class_.

Saya kira saya memiliki yang terakhir dalam deskripsi, tetapi saya masih berjuang untuk memahami bagaimana ini berkaitan dengan probabilitas kelas saya.

Lebih jauh, ketika saya mencoba mengakses classes_atribut untuk forestmodel saya mendapatkan AttributeErrordan atribut ini tidak ada di MultiOutputClassifier. Bagaimana saya bisa menghubungkan kelas dengan output?

print(forest.classes_)

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

Jawaban:

31

Dengan asumsi target Anda adalah (0,1), maka classifier akan mengeluarkan matriks probabilitas dimensi (N, 2). Indeks pertama mengacu pada probabilitas bahwa data tersebut milik kelas 0, dan yang kedua mengacu pada probabilitas bahwa data tersebut milik kelas 1.

Keduanya akan berjumlah 1.

Anda kemudian dapat menampilkan hasilnya dengan:

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

Jika Anda memiliki kelas k, hasilnya adalah (N, k), Anda harus menentukan probabilitas kelas mana yang Anda inginkan.

chrisckwong821
sumber
2
Jika ini masalahnya, saya masih bingung mengapa ada dua kolom untuk setiap kelas. Jika setiap kelas memiliki entri sendiri, bukankah setiap entri harus berupa (N, 1) matriks untuk menggambarkan probabilitas kelas itu?
Harpal
2
dua kolom untuk dua kelas, ingat bahwa ketika Anda mendefinisikan target (0,1), ada dua kelas. Setiap baris / datapoint akan membutuhkan prediksi pada 0 dan 1. Misalnya datapoint1 memiliki kemungkinan 80% untuk menjadi 0, dan 20% milik 1. output akan menjadi (0.8.0.2). Anda perlu mengakses prediciton [:, 1] untuk mendapatkan kolom kedua jika Anda menginginkan prediksi untuk 1. Secara umum prediksi akses [:, k] jika Anda ingin kemungkinan kelas k
chrisckwong821
1
Ini tampaknya mengabaikan bahwa pertanyaannya adalah tentang model multi-output.
Ben Reiniger
2

Dalam MultiOutputClassifier, Anda memperlakukan kedua output sebagai tugas klasifikasi terpisah; dari dokumen yang Anda tautkan:

Strategi ini terdiri dari pemasangan satu classifier per target.

Jadi dua array dalam daftar yang dihasilkan mewakili masing-masing dari dua classifiers / variabel dependen. Array kemudian adalah output klasifikasi biner (kolom yang merupakan probabilitas kelas 0, probabilitas kelas 1) yang disebutkan @ chrisckwong821, tetapi satu untuk setiap masalah.

Dengan kata lain, nilai balik dari predict_probaakan menjadi daftar yang panjangnya sama dengan lebar Anda y, yaitu n_outputs, dalam kasus Anda 2. Kutipan Anda dari predict_probareferensi dokumentasi n_outputs, yang diperkenalkan dalam dokumentasi untuk fit:

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

y : (jarang) seperti array, bentuk (n_samples, n_outputs)

Ben Reiniger
sumber
Saya setuju dengan komentar Anda, jawaban yang paling banyak dipilih tidak menjawab pertanyaan, tidak menjelaskan mengapa ada berbagai bentuk (N, 2). Jawaban Anda tidak menjawab pertanyaan:n_outputs
The Red Pea
1
Terima kasih, saya terkejut menemukan jawaban lain yang sangat dipilih. Dan terima kasih untuk hasil editnya!
Ben Reiniger
0

Untuk pertanyaan pertama:

Array 5x2 pertama memberi Anda probabilitas dari 5 sampel pengujian yang diklasifikasikan dalam kelas pertama. Selain itu, kolom pertama dari array 5x2 ini memberi tahu Anda "probabilitas bahwa sampel pengujian tidak diklasifikasikan sebagai kelas pertama" dan kolom kedua array 5x2 ini memberi tahu Anda "probabilitas bahwa sampel pengujian diklasifikasikan sebagai kelas pertama ".

Demikian pula, array 5x2 kedua memberi Anda probabilitas klasifikasi untuk menguji sampel di kelas kedua.

Jika Anda ingin memeriksa ini, Anda dapat membandingkan nilai dalam array tersebut dengan hasil dari predict.

Terkadang, kembalinya predict_probamungkin memberi Anda daftar yang berisi array Nx1 dan array Nx2. Jika demikian, tidak ada data pengujian yang diklasifikasikan ke dalam array Nx1 yang diwakili kelas.

Johnhery
sumber