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 ...
Jawaban:
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=True
saat 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 apakahscikit-learn
implementasinya 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.
sumber
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)
sumber