Hutan acak terlalu cocok?

19

Saya bereksperimen dengan hutan acak dengan scikit-belajar dan saya mendapatkan hasil yang bagus dari set pelatihan saya, tetapi hasil yang relatif buruk pada set tes saya ...

Inilah masalah (terinspirasi dari poker) yang saya coba selesaikan: Kartu hole pemain A, kartu hole pemain B dan flop (3 kartu), pemain mana yang memiliki kartu terbaik? Secara matematis, ini adalah 14 input (7 kartu - satu peringkat dan satu suit untuk masing-masing) dan satu output (0 atau 1).

Berikut adalah beberapa hasil saya sejauh ini:

Training set size: 600k, test set size: 120k, number of trees: 25
Success rate in training set: 99.975%
Success rate in testing set: 90.05%

Training set size: 400k, test set size: 80k, number of trees: 100
Success rate in training set: 100%
Success rate in testing set: 89.7%

Training set size: 600k, test set size: 120k, number of trees: 5
Success rate in training set: 98.685%
Success rate in testing set: 85.69%

Berikut adalah kode yang relevan yang digunakan:

from sklearn.ensemble import RandomForestClassifier
Forest = RandomForestClassifier(n_estimators = 25) #n_estimator varies
Forest = Forest.fit(inputs[:trainingSetSize],outputs[:trainingSetSize])
trainingOutputs = Forest.predict(inputs[:trainingSetSize])
testOutputs = Forest.predict(inputs[trainingSetSize:])

Tampaknya terlepas dari jumlah pohon yang digunakan, kinerja pada set pelatihan jauh lebih baik daripada pada set tes, meskipun set pelatihan yang relatif besar dan sejumlah kecil fitur ...

Uwat
sumber
2
Saya tidak melihat selusin 'cepat' untuk hutan acak di sini. Validasi silang? Bayesian Priors? Sifat dari resampling? Pelatihan diatur untuk setiap pohon? Berapa persen bagian dari setiap pohon? ... ada banyak lagi yang bisa disebutkan, tetapi poin saya adalah Anda memiliki input lain untuk dipertimbangkan.
EngrStudent
1
Bisakah Anda menjelaskan masalah bagi mereka yang tidak tahu poker .. apakah ada perhitungan yang mudah untuk skor poker? maka lebih mudah untuk memahami apakah ada sesuatu yang secara fundamental salah dengan menggunakan RF ... Saya tidak tahu poker, tapi saya curiga RF mungkin adalah pendekatan yang salah - yaitu langkah pertama dalam RF adalah hanya menggunakan sebagian kecil dari input, sedangkan bagi saya akan tampak bahwa tidak ada cara untuk membangun classifier yang baik hanya menggunakan subset dari input - semua input diperlukan.
seanv507

Jawaban:

45

Ini adalah kesalahan rookie yang umum ketika menggunakan model RF (saya akan mengangkat tangan saya sebagai pelaku sebelumnya). Hutan yang Anda bangun menggunakan set pelatihan dalam banyak kasus akan cocok dengan data pelatihan hampir sempurna (seperti yang Anda temukan) ketika dipertimbangkan secara total. Namun, ketika algoritma membangun hutan, ia mengingat kesalahan prediksi out-of-bag (OOB), yang merupakan tebakan terbaik dari kesalahan generalisasi.

Jika Anda mengirim data pelatihan kembali ke metode prediksi (seperti yang Anda lakukan), Anda mendapatkan prediksi yang hampir sempurna ini (yang sangat optimistis) daripada kesalahan OOB yang benar. Jangan lakukan ini. Sebaliknya, objek Hutan yang terlatih seharusnya mengingat di dalamnya kesalahan OOB. Saya tidak terbiasa dengan implementasi scikit-belajar tetapi melihat dokumentasi di sini sepertinya Anda perlu menentukan oob_score=Truesaat memanggil metode fit, dan kemudian kesalahan generalisasi akan disimpan sebagaioob_score_di objek yang dikembalikan. Dalam paket R "randomForest", memanggil metode prediksi tanpa argumen pada objek yang dikembalikan akan mengembalikan prediksi OOB pada set pelatihan. Itu memungkinkan Anda menentukan kesalahan menggunakan beberapa ukuran lain. Mengirim pelatihan yang dikembalikan ke metode prediksi akan memberi Anda hasil yang berbeda, karena itu akan menggunakan semua pohon. Saya tidak tahu apakah scikit-learnimplementasinya akan melakukan ini atau tidak.

Merupakan kesalahan untuk mengirim data pelatihan kembali ke metode prediksi untuk menguji akurasi. Ini adalah kesalahan yang sangat umum, jadi jangan khawatir.

Bogdanovist
sumber
1
Terima kasih! Namun, saya masih memiliki kekhawatiran: Dengan contoh pelatihan 400 ribu dan 50 pohon, saya mendapatkan 89,6% benar, sedangkan dengan data sebanyak dan dua kali lebih banyak pohon, saya mendapat 89,7% benar ... Apakah ini menunjukkan bahwa RF tidak bagus metode untuk ini? Saya menggunakan jaringan saraf MLP di masa lalu dan mencapai akurasi ~ 98,5% pada set pengujian ...
Uwat
5
Itu mungkin, meskipun sepertinya Anda tidak menggunakan cukup banyak pohon. Biasanya Anda membutuhkan ribuan. Perhatikan bahwa jumlah pohon bukan parameter yang akan disetel dalam algoritme RF, lebih banyak selalu lebih baik, tetapi setelah Anda memiliki 'cukup' (untuk ditentukan secara empiris) kesalahan OOB tidak membaik dengan lebih banyak pohon. Bahkan untuk set data sederhana yang kecil, apa pun yang kurang dari 500 pohon tidak cukup.
Bogdanovist
1
Ada beberapa peringatan kecil untuk 'lebih banyak selalu lebih baik' untuk jumlah pohon, tetapi saya memahami bahwa Anda memerlukan gazjillions pohon sebelum Anda mulai mendapatkan kinerja yang baik. Dalam pengalaman saya, sebanyak pohon yang Anda miliki sumber daya CPU dan kesabaran untuk menghasilkan yang lebih baik, meskipun dengan hasil yang semakin berkurang begitu kurva kurva OBB (ntrees).
Bogdanovist
12

Saya pikir jawabannya adalah parameter max_features: int, string atau None, opsional (default = ”auto”) parameter. pada dasarnya untuk masalah ini Anda harus mengaturnya ke Tidak Ada, sehingga setiap pohon dibangun dengan semua input, karena jelas Anda tidak dapat membangun classifier yang tepat hanya menggunakan sebagian kecil dari kartu (default "otomatis" memilih sqrt (nfatures) input untuk setiap pohon)

seanv507
sumber
1
Itu dia! Akurasi 95% dengan 50 pohon dan 600 ribu contoh pelatihan.
Uwat
2
Perhatikan bahwa pada titik ini Anda hampir tidak menggunakan hutan acak, tetapi seperti yang dinyatakan oleh jawaban lain, itu bukan penggolong ideal untuk masalah persis ini.
Richard Rast