Waktu komputasi hutan acak dalam R

49

Saya menggunakan paket pesta dalam R dengan 10.000 baris dan 34 fitur, dan beberapa fitur fitur memiliki lebih dari 300 level. Waktu komputasi terlalu lama. (Butuh 3 jam sejauh ini dan belum selesai.)

Saya ingin tahu elemen apa yang berpengaruh besar pada waktu komputasi hutan acak. Apakah ada faktor dengan level terlalu banyak? Apakah ada metode yang dioptimalkan untuk meningkatkan waktu komputasi RF?

Chenghao Liu
sumber

Jawaban:

65

Kompleksitas keseluruhan dari RF adalah sesuatu seperti ; jika Anda ingin mempercepat perhitungan Anda, Anda dapat mencoba yang berikut:tidakcoba(# objek)catatan(# objek)

  1. Gunakan randomForestalih-alih party, atau, bahkan lebih baik, rangeratau Rborist(meskipun keduanya belum diuji pertempuran).
  2. Jangan gunakan rumus, yaitu panggilan randomForest(predictors,decision)alih-alih randomForest(decision~.,data=input).
  3. Gunakan do.traceargumen untuk melihat kesalahan OOB secara real-time; dengan cara ini Anda dapat mendeteksi bahwa Anda dapat menurunkan ntree.
  4. Tentang faktor; RF (dan semua metode hierarki) mencoba menemukan subset level optimal sehingga memindai kemungkinan ; untuk tujuan ini agak naif faktor ini dapat memberi Anda begitu banyak informasi - belum lagi randomForest tidak akan makan faktor dengan lebih dari 32 level. Mungkin Anda bisa memperlakukannya sebagai yang dipesan (dan dengan demikian setara dengan variabel numerik normal untuk RF) atau mengelompokkannya dalam beberapa kelompok, membagi atribut yang satu ini menjadi beberapa?2(# level-1)
  5. Periksa apakah komputer Anda belum kehabisan RAM dan menggunakan ruang swap. Jika demikian, beli komputer yang lebih besar.
  6. Akhirnya, Anda dapat mengekstrak beberapa bagian objek acak dan membuat beberapa percobaan awal tentang ini.
Pasang kembali Monica
sumber
2
Terima kasih, saya belajar banyak dari jawaban Anda dan melakukan tes seperti yang Anda katakan, selain itu, mengapa saran kedua bekerja?
Chenghao Liu
4
@ChenghaoLiu Formula dirancang untuk bingkai model liner yang kecil namun rumit, dan karenanya tidak efisien saat menyalin himpunan menjadi mahal.
1
Mengapa memanggil randomForest (prediktor, keputusan) mengurangi waktu berjalan?
JenSCDC
coba
1
@AndyBlankertz Formula interpretasi dalam randomForest tampaknya mengarah pada penyalinan seluruh input.
12

Karena randomForest adalah kumpulan gerobak independen yang dilatih berdasarkan bagian acak dari fitur dan catatan, maka cocok untuk paralelisasi. The combine()fungsi dalam paket randomForest akan menjahit bersama hutan dilatih mandiri. Ini adalah contoh mainan. Sebagai jawaban @mpq menyatakan Anda tidak boleh menggunakan notasi rumus, tetapi meneruskan dataframe / matriks variabel dan vektor hasil. Saya tidak tahu malu mengangkat ini dari dokumen.

library("doMC")
library("randomForest")
data(iris)

registerDoMC(4) #number of cores on the machine
darkAndScaryForest <- foreach(y=seq(10), .combine=combine ) %dopar% {
   set.seed(y) # not really needed
   rf <- randomForest(Species ~ ., iris, ntree=50, norm.votes=FALSE)
}

Saya melewati fungsi acak randomForest ke parameter .combine yang bernama sama (yang mengontrol fungsi pada output dari loop. Sisi bawahnya adalah Anda tidak mendapatkan tingkat kesalahan OOB atau lebih penting secara tragis variabel.

Sunting:

Setelah membaca ulang posting saya menyadari bahwa saya tidak berbicara tentang masalah 34+ faktor. Jawaban yang tidak dipikirkan secara keseluruhan bisa mewakili mereka sebagai variabel biner. Itu adalah setiap faktor kolom yang dikodekan 0/1 -level factor tentang ada / tidak adanya. Dengan melakukan beberapa pemilihan variabel pada faktor-faktor yang tidak penting dan menghapusnya, Anda dapat membuat ruang fitur Anda tidak tumbuh terlalu besar.

jdennison
sumber
Selamat datang di situs ini, @jdennison. Ini terlihat seperti kontribusi yang sangat bagus (walaupun saya benar-benar tidak tahu terlalu banyak tentang RF & tidak tentang komputasi paralel). Satu catatan, urutan jawaban dapat berfluktuasi dari waktu ke waktu, jadi yang terbaik adalah tidak merujuk pada "jawaban di atas", melainkan 'jawabannya oleh \ @ begitu-dan-begitu' sebagai gantinya.
gung - Reinstate Monica
Maaf atas jawaban Anda terlambat. Saya membaca blog Anda, kerja bagus
Chenghao Liu
3

Saya akan menyarankan beberapa tautan:

1) Kecilkan jumlah level variabel faktor adalah tautan ke pertanyaan stackoverflowuntuk menangani masalah yang sama saat menggunakan randomForestpaket. Secara khusus ini berhubungan dengan hanya menggunakan level yang paling sering terjadi dan menetapkan level baru untuk semua level lainnya, yang jarang terjadi.

Ide untuk itu datang dari sini: 2009 KDD Cup Slow Challenge . Data untuk kompetisi ini memiliki banyak faktor dengan banyak level dan membahas beberapa metode yang mereka gunakan untuk mengurangi data dari 50.000 baris dengan 15.000 kolom untuk dijalankan pada laptop RAM 2-core / 2GB.

Saran terakhir saya adalah melihat menjalankan masalah, seperti yang disarankan di atas, secara paralel pada contoh Amazon EC2 hi-CPU.

screechOwl
sumber
Tidak ada 2) . Anda harus memberikan bagian penting halaman daripada mengandalkan sepenuhnya pada tautan.
AL
Saya suka bagaimana instance EC dijalankan. Wow, apakah mereka baik. Saya pikir perangkat keras yang tervirtualisasi lebih baik daripada yang asli.
EngrStudent
2

Saya tidak dapat berbicara dengan kecepatan algoritma khusus dalam R tetapi harus jelas apa yang menyebabkan waktu komputasi yang lama. Untuk setiap pohon di setiap cabang, CART mencari bentuk pemecahan biner terbaik. Jadi untuk masing-masing 34 fitur itu yang paling terlihat pada pembagian yang diberikan oleh masing-masing tingkat variabel. Lipat gandakan waktu lari untuk setiap pemisahan dalam pohon dengan jumlah cabang di pohon dan kemudian gandakan dengan jumlah pohon di hutan dan Anda memiliki waktu berjalan yang lama. Siapa tahu? Mungkin bahkan dengan komputer cepat ini bisa memakan waktu bertahun-tahun untuk menyelesaikannya?

Cara terbaik untuk mempercepat hal-hal yang saya pikir adalah untuk menyatukan beberapa level bersama sehingga setiap variabel turun menjadi mungkin 3 hingga 5 level daripada 300. Tentu saja ini tergantung pada kemampuan untuk melakukan ini tanpa kehilangan penting informasi dalam data Anda.

Setelah itu mungkin Anda bisa melihat apakah ada beberapa algoritma pintar yang dapat mempercepat waktu pencarian untuk membelah pada setiap node dari masing-masing pohon. bisa jadi pada pohon tertentu pencarian split adalah pengulangan dari pencarian yang sudah dilakukan untuk pohon sebelumnya. Jadi, jika Anda dapat menyimpan solusi dari keputusan split sebelumnya dan mengidentifikasi kapan Anda mengulangi, mungkin strategi itu bisa menghemat sedikit waktu komputasi.

Michael Chernick
sumber
Terima kasih lagi, saya sangat setuju dengan Anda. Dan saya mencoba mengurangi jumlah level dengan metode dummy palsu. Sebagai contoh, saya mengganti prediktor dengan 600 level dengan 4 prediktor (sebagai 600 <5 ^ 4) Setelah transformasi ini, saya dapat menjalankan algoritma hutan acak. Namun, hasil RMSE aneh, saya akan membuka dua pertanyaan lain tentang cara mengurangi tingkat fitur faktor dan apa hubungan antara 10 kali lipat CV RMSE dan tes set skor RMSE?
Chenghao Liu