Pengambilan sampel dengan penggantian dalam R randomForest

11

Implementasi randomForest tidak memungkinkan pengambilan sampel melebihi jumlah pengamatan, bahkan ketika pengambilan sampel dengan penggantian. Kenapa ini?

Bekerja dengan baik:

rf <- randomForest(Species ~ ., iris, sampsize=c(1, 1, 1), replace=TRUE)
rf <- randomForest(Species ~ ., iris, sampsize=3, replace=TRUE)

Apa yang ingin saya lakukan:

rf <- randomForest(Species ~ ., iris, sampsize=c(51, 1, 1), replace=TRUE)
Error in randomForest.default(m, y, ...) : 
  sampsize can not be larger than class frequency

Kesalahan serupa tanpa sampel bertingkat:

rf <- randomForest(Species ~ ., iris, sampsize=151, replace=TRUE)
Error in randomForest.default(m, y, ...) : sampsize too large

Karena saya mengharapkan metode untuk mengambil sampel bootstrap ketika diberi ganti = BENAR dalam kedua kasus, saya tidak mengharapkan batas ini.

Tujuan saya adalah untuk menggunakan ini dengan opsi pengambilan sampel bertingkat, untuk menarik sampel yang cukup besar dari kelas yang relatif jarang.

cohoz
sumber
Saya tidak yakin apa alasan sebenarnya, tetapi sampel bootstrap biasanya berukuran sama dengan sampel asli Anda, jadi perilaku ini tampaknya sangat sesuai dengan apa yang saya harapkan dari sesuatu yang mengaku mengambil sampel bootstrap.
joran
1
Ya, itu pilihan kata saya bukan pada dokumentasi, tapi maksud Anda diterima dengan baik. Namun, ini merepotkan ketika mencoba untuk menyeimbangkan kembali distribusi dan saya tidak tahu alasan mengapa ini adalah pembatasan yang membantu untuk memaksakan.
cohoz

Jawaban:

5

Ini tidak menjawab mengapa , tetapi untuk menyiasatinya, seseorang dapat menduplikasi data untuk kelas langka dalam data pelatihan, dan mengambil sampel hasil yang distratifikasi.

Dua kelemahan dari pendekatan ini, dibandingkan dengan oversampling "alami":

  • perkiraan out of bag tidak lagi berarti
  • diperlukan lebih banyak sumber daya untuk menyimpan objek dan mengambil sampel acak

tetapi itu akan memungkinkan seseorang untuk membangun hutan dengan rasio kelas yang diinginkan.

cohoz
sumber
4

Saya memiliki pertanyaan yang sama persis dan menemukan ini di changelog untuk randomForest :

Perubahan 4.1-0:

  • Dalam randomForest (), jika sampsize diberikan, pengambilan sampel sekarang dilakukan tanpa penggantian, selain dikelompokkan berdasarkan kelas. Karena itu sampsize tidak boleh lebih besar dari frekuensi kelas.

Pengaturan ganti = TRUE secara manual juga sepertinya tidak mengesampingkan ini.

hgcrpd
sumber
2
Ini mungkin terjadi bahwa parameter ganti hanya diabaikan, tetapi kemudian di changelog itu: Perubahan 4.5-12: * Menambahkan argumen 'strata' ke randomForest, yang, bersama dengan 'sampsize', memungkinkan pengambilan sampel (dengan atau tanpa penggantian) sesuai dengan variabel strata (yang bisa berupa sesuatu selain variabel kelas). Saat ini hanya berfungsi dalam klasifikasi.
cohoz
Sebagai contoh, kesalahan yang sama dihasilkan melaluirf <- randomForest(Species ~ ., iris, sampsize=c(51, 1, 1), strata=iris$Species, replace=TRUE)
cohoz
Selain itu, beberapa kasus uji dengan versi saat ini (4.6-7) menunjukkan bahwa sampel diambil dengan penggantian, jadi ini bukan penjelasannya.
cohoz
1
Saya akhirnya hanya oversampling sebelum menjalankan randomForest. Mungkin ada yang salah dengan metodologi ini, tetapi sepertinya bekerja ketika saya menguji hasilnya.
hgcrpd
1
Tidak, itu solusinya yang saya gunakan dan melakukan persis apa yang diinginkan. Khusus untuk kasus penggunaan satu kelas yang relatif jarang, menduplikasi data untuk kelas itu pada set pelatihan dan sebelum mengambil sampel bertingkat berfungsi dengan baik dan "biaya" dalam hal memori tambahan / CPU tidak terlalu tinggi. Saya kira itu layak untuk menuliskan "jawaban" meskipun itu sebenarnya bukan jawaban ...
cohoz