Apa skor oob yang baik untuk hutan acak dengan sklearn, klasifikasi tiga kelas? [duplikat]

8

Saya memiliki data pembelajaran yang terdiri dari ~ 45 ribu sampel, masing-masing memiliki 21 fitur. Saya mencoba untuk melatih classifier hutan acak pada data ini, yang dilabeli menjadi 3 kelas (-1, 0 dan 1). Kelas kurang lebih sama ukurannya.

Model klasifikasi hutan acak saya gunakan ginisebagai kriteria kualitas split, jumlah pohon 10, dan saya belum membatasi kedalaman pohon.

Sebagian besar fitur menunjukkan tingkat kepentingan yang dapat diabaikan - rata-rata sekitar 5%, sepertiga di antaranya penting 0, sepertiga di antaranya penting di atas rata-rata.

Namun, mungkin fakta yang paling mencolok adalah skor oob (out-of-bag): sedikit kurang dari 1%. Itu membuat saya berpikir model gagal, dan memang, menguji model pada set ukuran independen baru ~ 40k, saya mendapat skor 63% (kedengarannya bagus sejauh ini), tetapi pemeriksaan yang lebih dalam dari matriks kebingungan telah menunjukkan kepada saya bahwa model hanya berhasil untuk kelas 0, dan gagal di sekitar 50% dari kasus ketika harus memutuskan antara 1 dan -1.

Output Python terlampir:

array([[ 7732,   185,  6259],
       [  390, 11506,   256],
       [ 7442,   161,  6378]])

Ini wajar karena kelas 0 memiliki properti khusus yang membuatnya lebih mudah diprediksi. Namun, benarkah skor oob yang saya temukan sudah merupakan pertanda bahwa modelnya tidak bagus? Apa skor oob yang baik untuk hutan acak ? Apakah ada beberapa hukum yang membantu menentukan apakah suatu model "baik", menggunakan skor oob sendiri, atau dalam kombinasi dengan beberapa hasil lain dari model?


Sunting: setelah menghapus data buruk (sekitar sepertiga dari data), label kurang lebih 2% untuk 0 dan 49% untuk masing-masing -1 / + 1. Skor oob adalah 0,011 dan skor pada data uji adalah 0,49, dengan matriks kebingungan hampir tidak bias terhadap kelas 1 (sekitar 3/4 dari prediksi).

Bach
sumber
2
Untuk memperjelas. Anda menggunakan scikit belajar ? Dan itu melaporkan skor oob <0,001? Kemudian gunakan fungsi .score pada data baru yang Anda dapatkan .63? Secara umum saya telah menemukan skor oob untuk mencerminkan atau sedikit meremehkan skor validasi silang. Saya pikir skor dalam scikit belajar klasifikasi adalah akurasi rata-rata di seluruh kelas (jika saya membaca dokumen dengan benar?) Sehingga mereka tidak boleh langsung dibandingkan dengan keseluruhan / akurasi non rata-rata tetapi ini tergantung pada implementasi dan tidak seharusnya menyebabkan ini perbedaan besar.
Ryan Bressler
Ya, saya menggunakan scikit belajar, skor oob sedikit di bawah 0,01 , dan skor pada data tes sekitar 0,63.
Bach
Apakah baris Anda independen atau apakah Anda memiliki pengukuran berulang untuk kasus yang sama (atau data hierarkis / berkerumun)? Juga: tolong jelaskan: apakah "skor" oob Anda adalah ukuran kesalahan atau ukuran perjanjian?
cbeleites tidak senang dengan SX
Baris saya tidak berulang tetapi mungkin tergantung. Saya percaya scikititu oob_scoreadalah skor, yaitu ukuran kesepakatan. Saya tidak dapat menemukannya didokumentasikan.
Bach
Pencarian cepat membawa saya ke halaman manual forest, di mana dikatakan "oob_score: bool Apakah akan menggunakan sampel out-of-bag untuk memperkirakan kesalahan generalisasi" jadi ini terlihat seperti ukuran kesalahan bagi saya. Jika ini benar, estimasi oob Anda terlalu optimis - yang akan menjadi "gejala" dari baris dependen.
cbeleites tidak senang dengan SX

Jawaban:

4

RF sklearn oob_score_(perhatikan trailing underscore) secara serius tidak terlalu jelas dibandingkan dengan R, setelah membaca sklearn doc dan kode sumber. Saran saya tentang cara meningkatkan model Anda adalah sebagai berikut:

  1. RF sklearn digunakan untuk menggunakan default yang mengerikan dari max_features=1(seperti dalam "coba setiap fitur pada setiap node"). Maka itu tidak lagi melakukan kolom acak (/ fitur) -pilihan seperti hutan-acak. Ubah ini menjadi eg max_features=0.33(seperti R mtry) dan jalankan kembali. Beri tahu kami skor baru.

  2. "Sebagian besar fitur menunjukkan kepentingan yang diabaikan" . Maka Anda perlu melakukan Seleksi Fitur, sesuai dokumen - untuk klasifikasi. Lihat dokumen dan artikel lain di sini di CrossValidated.SE. Lakukan FS pada set holdout yang berbeda (katakanlah 20-30%) dari pada pelatihan lainnya, dengan menggunakan mis. sklearn.cross_validation.train_test_split()(Ya namanya agak menyesatkan). Sekarang beri tahu kami skor yang Anda dapatkan setelah FS?

  3. Anda berkata "setelah menghapus data buruk (sekitar sepertiga dari data), labelnya kurang lebih 2% untuk 0 dan 49% untuk masing-masing -1 / + 1" ; maka Anda memiliki ketidakseimbangan kelas yang parah . Juga: "matriks kebingungan menunjukkan model hanya berhasil untuk kelas 0, dan gagal dalam sekitar 50% dari kasus antara +1 dan -1" . Ini adalah gejala ketidakseimbangan kelas. Entah Anda menggunakan pengambilan sampel bertingkat, atau melatih pengklasifikasi dengan contoh untuk kelas +1 dan -1. Anda dapat melakukan classifier OAA (One-Against All) atau OAO (One-Against One). Coba tiga pengklasifikasi OAA, satu untuk setiap kelas. Akhirnya, beri tahu kami skor itu?

smci
sumber
6
Hanya FYI, di scikit 0.16.1 standar untuk max_features adalah "otomatis" bukan 1 di mana "otomatis" diterjemahkan menjadi sqrt (number_features).
firefly2442
1

Tidak ada yang namanya oob_score bagus, yang membedakan antara valid_score dan oob_score itu penting.

Pikirkan oob_score sebagai skor untuk beberapa subset (katakanlah, oob_set) dari set pelatihan. Untuk mempelajari bagaimana ini dibuat, rujuk ini .

oob_set diambil dari set pelatihan Anda. Dan Anda sudah memiliki set validasi Anda (katakanlah, valid_set).

Mari kita asumsikan skenario di mana, validation_score Anda adalah 0,7365 dan oob_score adalah 0,8329

Dalam skenario ini, model Anda berkinerja lebih baik di oob_set, yang diambil langsung dari dataset pelatihan Anda. Menunjukkan, validation_set adalah untuk periode waktu yang berbeda. (katakanlah training_set memiliki catatan untuk bulan "Januari" dan validation_set memiliki catatan untuk bulan "Juli"). Jadi, lebih dari sekadar tes untuk kinerja model, oob_score adalah tes untuk "seberapa representatif Anda Validation_set".

Anda harus selalu memastikan bahwa Anda memiliki validation_set representatif yang baik, karena skornya digunakan sebagai indikator untuk kinerja model kami. Jadi, tujuan Anda seharusnya, untuk memiliki perbedaan sesedikit mungkin antara oob_score dan valid_score.

Saya biasanya menggunakan oob_score dengan validation_score untuk melihat seberapa bagus validation_set saya. Saya belajar teknik ini dari Jeremy Howard .

Ankur Singh
sumber
0

T: Apa skor oob yang baik untuk hutan acak dengan sklearn, klasifikasi tiga kelas?

A: Tergantung. Dalam pandangan saya, jika belajar dan menguji sampel diambil dari distribusi yang sama, maka -dalam pandangan saya- OOB sama dengan sekitar 3 kali lipat cross-validation. Jadi jika kita mengulangi pertanyaan yang sama tetapi dengan "validasi silang 3 kali lipat", jawabannya akan sama, yaitu "secara umum, akurasi tertinggi penggabung, kecuali jika Anda takut untuk menyesuaikan set pembelajaran Anda karena seseorang mengatakan kepada Anda bahwa sampel pengujian yang benar adalah dari distribusi yang berbeda ".

Bisakah Anda memberi saya dataset Anda? Saya bisa bersenang-senang dengannya dan memberi tahu Anda apa yang bisa saya lakukan dengannya secara gratis.

manusia gua
sumber
0

pendapat yang berbeda: untuk memulai, Anda harus mengasosiasikan kerugian dengan setiap kesalahan klasifikasi yang Anda lakukan. Harga yang dibayar / hilang / penalti untuk kesalahan klasifikasi ini (mungkin) akan berbeda untuk False Positive (FP) vs False Negatives (FN). Beberapa klasifikasi, misalnya deteksi kanker, lebih suka memiliki lebih banyak FP daripada FN. Beberapa lainnya, katakanlah filter spam, lebih suka mengizinkan spam tertentu (FN) daripada memblokir mail (FP) dari teman Anda. Membangun logika ini Anda dapat menggunakan skor-F1 atau Akurasi, apa pun yang sesuai dengan tujuan Anda (misalnya. Saya bisa bahagia jika filter spam saya tidak memiliki FP dan skor 0,1 karena saya memiliki spam 10% lebih sedikit untuk dikhawatirkan Di sisi lain, orang lain mungkin tidak senang bahkan 0,9 (90% spam disaring). Apa yang akan menjadi skor bagus?)

Anurag Priyadarshi
sumber