Metode penilaian RandomForestClassifier OOB

16

Apakah implementasi hutan acak di scikit-belajar menggunakan akurasi rata-rata sebagai metode penilaian untuk memperkirakan kesalahan generalisasi dengan sampel out-of-bag? Ini tidak disebutkan dalam dokumentasi, tetapi metode skor () melaporkan akurasi rata-rata.

Saya memiliki dataset yang sangat tidak seimbang, dan saya menggunakan AUC ROC sebagai metrik penilaian saya dalam pencarian kisi. Apakah ada cara untuk memberitahu classifier untuk menggunakan metode penilaian yang sama pada sampel OOB juga?

darXider
sumber
The oob_score parameter RandomForestClassifier kelas tidak melakukan apa yang Anda inginkan?
Pierre
AFAIK, oob_scorelaporkan keakuratannya. Saya perlu melihat kode sumber lagi.
darXider
Parameter apa yang Anda perkirakan dengan pencarian kisi Anda?
JahKnows
^ Maaf, tapi saya benar-benar tidak ingat sekarang! Saya menanyakan pertanyaan ini 1,5 tahun yang lalu.
darXider

Jawaban:

14

Secara umum, kinerja pengklasifikasi dibandingkan dengan menggunakan akurasi, ini adalah ukuran dari jumlah instance yang diklasifikasikan dengan benar dibagi dengan jumlah total instance. Namun, dari data pelatihan kita bisa mendapatkan perkiraan yang lebih baik dari kesalahan yang diharapkan dari pengklasifikasi kita ketika kita menggunakan teknik ensemble learning atau bagging.

Kesalahan out-of-bag

Metrik ini adalah akurasi dari contoh menggunakan semua pohon dalam ensemble hutan acak yang dihilangkan selama pelatihan. Jadi itu semacam bertindak sebagai contoh semi-pengujian. Anda bisa mengetahui seberapa baik klasifikasi Anda dapat digeneralisasi menggunakan metrik ini.xi

Untuk mengimplementasikan oob di sklearn, Anda perlu menentukannya saat membuat objek Random Forests Anda

from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100, oob_score = True)

Lalu kita bisa melatih modelnya

forest.fit(X_train, y_train)
print('Score: ', forest.score(X_train, y_train))

Nilai: 0,979921928817

Seperti yang diharapkan, keakuratan model ketika mengevaluasi set pelatihan sangat tinggi. Namun, ini tidak ada artinya karena Anda bisa sangat cocok dengan data Anda dan dengan demikian model Anda adalah sampah. Namun, kita dapat menggunakan skor out-of-bag sebagai

print(forest.oob_score_)

0.86453272101

Ini adalah akurasi saat mengevaluasi contoh kami dalam set pelatihan hanya menggunakan pohon yang dihilangkan. Sekarang mari kita hitung skor pada set pengujian sebagai

print('Score: ', forest.score(X_test, y_test))

Nilai: 0,86517733935

Kami melihat bahwa akurasi yang diukur oleh oob sangat mirip dengan yang diperoleh dengan set pengujian. Dengan demikian mengikuti melalui teori bahwa akurasi oob adalah metrik yang lebih baik untuk mengevaluasi kinerja model Anda daripada hanya skor. Ini adalah konsekuensi dari model pengemasan dan tidak dapat dilakukan dengan jenis pengklasifikasi lain.

Menghitung oob menggunakan metrik yang berbeda

Ya, Anda bisa melakukan ini! Namun, tergantung bagaimana tepatnya kode Anda disusun. Saya tidak yakin bagaimana Anda bisa memasukkan oob dan AUC bersama-sama dengan cross_val_scorefungsinya. Namun, jika Anda melakukan lipatan validasi silang secara manual, Anda dapat melakukan yang berikut, algoritma hutan acak di sklearn memberi Anda fungsi keputusan oob sebagai

print(forest.oob_decision_function_)

Kelas kemudian dapat diperoleh dengan menggunakan

from sklearn import metrics
pred_train = np.argmax(forest.oob_decision_function_,axis=1)

Kemudian kita dapat menghitung AUC dengan menggunakan yang berikut ini

metrics.roc_auc_score(y_train, pred_train)

0.86217157846471204

JahKnows
sumber
4
Terima kasih! Saya menyadari bagaimana proses OOB bekerja di hutan acak. Saya secara khusus bertanya apakah RandomForestClassifierdapat mengembalikan skor OOB yang BUKAN keakuratan, dan bagian kedua dari jawaban Anda memberikan petunjuk yang sangat baik tentang bagaimana mendekati masalah ini. Namun, saya harus menekankan bahwa seseorang tidak boleh menggunakan label kelas untuk menghitung AUC dari kurva ROC; melainkan, probabilitas kelas harus digunakan secara langsung. Jadi, definisi yang benar adalah pred_train = forest.oob_decision_function_[:, 1].
darXider
@darXider Bukankah ini teduh, karena forest.oob_decision_function_.shape [0] == X_train.shape [0], sementara saya mengharapkannya menjadi == jumlah sampel OOB, yang seharusnya lebih kecil dari jumlah sampel di X_train? Juga, secara pribadi saya tertarik untuk menghitung logloss, untuk orang lain yang ingin melakukan ini juga, saya pikir pred_train harus = forest.oob_decision_function_ sebagai gantinya.
Sander Vanden Hautte