RandomForest R tidak dapat menangani lebih dari 32 level. Apa solusinya?

22

Paket randomForest R tidak dapat menangani faktor dengan lebih dari 32 level. Ketika diberikan lebih dari 32 level, ia memancarkan pesan kesalahan:

Tidak dapat menangani prediktor kategori dengan lebih dari 32 kategori.

Tetapi data yang saya miliki memiliki beberapa faktor. Beberapa dari mereka memiliki 1000+ level dan beberapa dari mereka memiliki 100+. Ia bahkan memiliki 'status' negara bagian yaitu 52.

Jadi, inilah pertanyaan saya.

  1. Mengapa ada batasan seperti itu? randomForest menolak untuk menjalankan bahkan untuk kasus sederhana.

    > d <- data.frame(x=factor(1:50), y=1:50)
    > randomForest(y ~ x, data=d)
      Error in randomForest.default(m, y, ...) : 
      Can not handle categorical predictors with more than 32 categories.
    

    Jika itu hanya karena keterbatasan memori, bagaimana scikit dapat belajar randomForeestRegressor belajar berjalan dengan lebih dari 32 level?

  2. Apa cara terbaik untuk menangani masalah ini? Misalkan saya memiliki X1, X2, ..., X50 variabel independen dan Y adalah variabel dependen. Dan misalkan X1, X2 dan X3 memiliki lebih dari 32 level. Apa yang harus saya lakukan?

    Apa yang saya pikirkan adalah menjalankan algoritma clustering untuk masing-masing X1, X2 dan X3 di mana jarak didefinisikan sebagai perbedaan dalam Y. Saya akan menjalankan tiga clustering karena ada tiga variabel bermasalah. Dan di setiap pengelompokan, saya berharap dapat menemukan level yang sama. Dan saya akan menggabungkan mereka.

    Bagaimana ini terdengar?

Minkoo Seo
sumber
Mencari di web dengan nama paket dan pesan kesalahan memberikan beberapa jawaban.
Roland
5
@Roland Sebenarnya itu menuntun saya ke sini ...
isomorphism
1
Anda dapat mencoba ilmu data karena beberapa orang statistik di sana memiliki pengalaman pemrograman untuk data dengan banyak dimensi.
aeroNotAuto
2
PEMBARUAN: Sejak versi 4.6-9, randomForestdapat menangani prediktor kategori hingga 53 level. News
Ben
Bagaimana hutan acak R menentukan jumlah level? Saya kira level berarti kategori.
ajp

Jawaban:

25

Ini sebenarnya merupakan kendala yang cukup masuk akal karena pemisahan pada faktor dengan level sebenarnya merupakan pilihan dari salah satu dari kombinasi 2 N - 2 yang mungkin. Jadi, bahkan dengan N seperti 25, ruang kombinasi begitu besar sehingga kesimpulan seperti itu masuk akal.N2N-2N

N

Pilihan lainnya adalah mengubah representasi - mungkin hasil Anda tidak secara langsung bergantung pada entitas negara tetapi, misalnya, area, populasi, jumlah pohon pinus per kapita atau atribut lainnya, Anda dapat menyambungkannya ke sistem informasi Anda.

Mungkin juga bahwa setiap negara adalah entitas yang terisolasi dan tidak berkorelasi sehingga memerlukan model terpisah untuk dirinya sendiri.

Pengelompokan berdasarkan keputusan mungkin merupakan ide yang buruk karena dengan cara ini Anda menyelundupkan informasi dari keputusan ke atribut, yang sering berakhir dengan overfitting.


sumber
4
Ini dapat dengan mudah dipindahkan, meskipun dengan cara yang sedikit membosankan. Misalnya, jika Anda memiliki antara 33 dan 1024 level, buat dua faktor masing-masing dari <= 32 level.
KalEl
15

Alasan utamanya adalah bagaimana randomForest diimplementasikan. Implementasi dari R mengikuti banyak dari spesifikasi Breiman asli. Yang penting di sini untuk diperhatikan adalah bahwa untuk variabel faktor / kategorikal, kriteria pembagiannya adalah biner dengan beberapa nilai label di sebelah kiri dan label lainnya di sebelah kanan.

01[0;2M.-1]

Mengapa implementasi dari Weka dan Python berfungsi?

Implementasi weka tidak menggunakan pohon CART secara default. Ia menggunakan pohon C45 yang tidak memiliki masalah komputasi ini, karena untuk input kategorikal ia terbagi dalam beberapa simpul, satu untuk setiap nilai level.

Implementasi python random forest tidak bisa menggunakan variabel kategori / faktor. Anda harus menyandikan variabel-variabel itu menjadi variabel dummy atau numerik.

M.

rapaio
sumber
2
Terima kasih banyak! Apakah itu mengikuti dari jawaban Anda bahwa implementasi R untuk memperlakukan nilai kategorikal lebih tinggi daripada Python (saya ingat Max Kuhn menyebutkan variabel kategori pengelompokan untuk RF memberikan hasil yang sedikit lebih baik daripada membuat angka itu), atau setidaknya menjalankan Random Forest di R vs Python Saya memiliki peluang yang sangat baik untuk mendapatkan hasil yang berbeda (akurasi, dll ...)? Dari pengalaman Anda, ketika membuat model, apakah masuk akal mencoba kedua vars pengelompokan (dalam R) dan membuat dummifying mereka kemudian membandingkan dua pendekatan?
Sergey Bushmanov
2
Pengkodean Dummy berfungsi tetapi hanya dapat menghasilkan satu kategori vs semua. Setelah variabel pengkodean diuji satu per satu. Jadi, tidak mungkin untuk menerapkan dua hal. Jika fitur ini dapat membantu, saya pikir secara praktis tidak ada perbedaan besar. Namun ada hal-hal lain yang mungkin perlu diperhatikan ketika bekerja dengan variabel penting: beberapa implementasi bias menuju kategori dengan berbagai tingkatan. Lihat makalah Carolin Strobl untuk rincian: statistik.uni-dortmund.de/useR-2008/slides/Strobl+Zeileis.pdf . Di R ada beberapa implementasi yang tidak memiliki bias ini.
rapaio
2

Anda dapat mencoba mewakili satu kolom itu secara berbeda. Anda bisa mewakili data yang sama dengan kerangka data yang jarang.

Kode minimum yang layak;

example <- as.data.frame(c("A", "A", "B", "F", "C", "G", "C", "D", "E", "F"))
names(example) <- "strcol"

for(level in unique(example$strcol)){
      example[paste("dummy", level, sep = "_")] <- ifelse(example$strcol == level,     1, 0)
}

Perhatikan bagaimana setiap nilai di kolom asli sekarang menjadi kolom dummy yang terpisah.

Kode contoh yang lebih luas;

set.seed(0)
combs1 = sample.int(33, size= 10000, replace=TRUE)
combs2 = sample.int(33, size= 10000, replace=TRUE)
combs3 = combs1 * combs2 + rnorm(10000,mean=0,100)
df_hard = data.frame(y=combs3, first=factor(combs1), second=factor(combs2))

for(level in unique(df_hard$first)){
    df_hard[paste("first", level, sep = "_")] <- ifelse(df_hard$first == level, 1, 0)
}

for(level in unique(df_hard$second)){
    df_hard[paste("second", level, sep = "_")] <- ifelse(df_hard$second == level, 1, 0)
}

example$first <- NULL
example$second <- NULL

rf_mod = randomForest( y ~ ., data=example )

Meskipun potongan kode ini menunjukkan bahwa Anda memang tidak akan lagi mendapatkan kesalahan, Anda akan melihat bahwa algoritma randomForest sekarang membutuhkan waktu yang lama sebelum selesai. Ini karena kendala CPU, Anda dapat memetakan pengurangan tugas ini melalui pengambilan sampel sekarang juga.

Untuk informasi lebih lanjut silakan lihat blogpost ini:

https://blog.cloudera.com/blog/2013/02/how-to-resample-from-a-large-data-set-in-parallel-with-r-on-hadoop/

Vincent Warmerdam
sumber
Blok kode kedua terlihat membingungkan, Meskipun Anda menggunakan df_hard di seluruh tubuh, di baris terakhir, Anda menetapkan "pertama" dan "kedua" ke NULL, dan juga menggunakan "contoh" sebagai data untuk randomForest ini tidak masuk akal untuk saya, karena tidak ada hubungan antara contoh dan df_hard.
Özgür
Vincent, tidakkah Anda merasa saya akan berakhir dengan masalah besar jika saya memiliki level pesanan 100+, apakah Anda menyarankan untuk menambahkan setiap kolom sebagai input secara acak?
Hardik Gupta
Alternatif lain adalah dengan menggunakan implementasi hutan acak di H2O; ini memiliki dukungan yang lebih baik untuk kumpulan data besar. Saya tidak mengerti bit "tambahkan setiap kolom sebagai input ke acak".
Vincent Warmerdam
0

Anda dapat menggunakan paket extraTrees sebagai gantinya. Algoritme hutan yang teracak secara ekstrim tidak mencoba breakpoint / split, tetapi hanya subset pemisahan acak yang terbatas.

Soren Havelund Welling
sumber
1
extraTrees memiliki keterbatasan, dalam arti input Anda harus berupa matriks data numerik, bukan?
Hardik Gupta
0

Pilihan lain: tergantung pada jumlah level dan jumlah pengamatan dalam data Anda, Anda bisa menggabungkan beberapa level. Selain mendapatkan di bawah batas, itu dapat mengurangi varians jika Anda memiliki banyak level hanya dengan beberapa pengamatan. Hadley 's forcats: fct_lump melakukan hal ini.

Scott Kaiser
sumber