Hutan acak: bagaimana menangani tingkat faktor baru dalam set uji?

13

Saya mencoba membuat prediksi menggunakan model hutan acak di R.

Namun saya mendapatkan kesalahan karena beberapa faktor memiliki nilai yang berbeda di set tes daripada di set pelatihan. Misalnya, suatu faktor Cat_2memiliki nilai 34, 68, 76, dll., Di set tes yang tidak muncul di set pelatihan. Sayangnya, saya tidak memiliki kendali atas set Tes ... Saya harus menggunakannya apa adanya.

Solusi saya satu-satunya adalah mengubah faktor yang bermasalah kembali ke nilai numerik, menggunakan as.numeric(). Ini berfungsi tetapi saya tidak begitu puas, karena nilai-nilai ini adalah kode yang tidak memiliki arti numerik ...

Apakah Anda pikir akan ada solusi lain, untuk menjatuhkan nilai-nilai baru dari set tes? Tetapi tanpa menghapus semua nilai faktor lainnya (katakanlah nilai 1, 2, 14, 32, dll.) Yang ada dalam pelatihan dan tes, dan berisi informasi yang berpotensi berguna untuk prediksi.

Benoit_Plante
sumber
1
Saya tahu alasan mengapa nilai-nilai dalam tes harus dalam set pelatihan. Gagasan klasifikasi adalah menggunakan data pelatihan untuk mendapatkan gambaran seperti apa kepadatan bersyarat kelas itu. Anda tidak bisa melihat setiap nilai yang mungkin dari kepadatan. I variabel digunakan dalam pohon split on kemudian split menentukan cabang mana yang harus diikuti untuk setiap nilai yang tidak terlihat serta yang telah dilihat.
Michael R. Chernick
Anda membuat poin yang valid, tetapi pada level praktis menggunakan alat khusus yang menanyakan (paket RF dalam R) ini tidak diperbolehkan. Jawaban saya yang melibatkan imputasi adalah salah satu cara mengatasinya, meskipun tentu bukan solusi terbaik. Apakah setidaknya membuat kode tidak crash, jadi setidaknya berfungsi, untuk nilai kerja yang kecil.
Bogdanovist
Mirip dengan pertanyaan saya di sini: stats.stackexchange.com/questions/18004/… . Saya pikir saya mungkin menggunakan GBM daripada RF karena tampaknya berurusan dengan tingkat faktor baru yang lebih baik. Juga, sudahkah Anda melihat implementasi RF di pesta? Saya tidak pernah menyukai randomForest karena masalah ini (dan ketidakmampuan untuk secara mulus menangani nilai-nilai yang hilang).
B_Miner

Jawaban:

2

Jika set tes memiliki banyak poin ini dengan nilai-nilai faktor baru maka saya tidak yakin apa pendekatan terbaiknya. Jika itu hanya beberapa poin Anda mungkin bisa lolos dengan sesuatu yang aneh seperti memperlakukan tingkat faktor yang salah sebagai data yang hilang dan menusuk mereka dengan pendekatan apa pun yang Anda inginkan. Implementasi R memiliki beberapa cara untuk menghubungkan data yang hilang, Anda hanya perlu mengatur level faktor ini menjadi NA untuk menunjukkan bahwa data tersebut hilang.

Bogdanovist
sumber
8

King dan Bonoit , cuplikan ini dapat berguna untuk menyelaraskan level:

for(attr in colnames(training))
{
  if (is.factor(training[[attr]]))
  {
    new.levels <- setdiff(levels(training[[attr]]), levels(testing[[attr]]))
    if ( length(new.levels) == 0 )
    { print(paste(attr, '- no new levels')) }
    else
    {
      print(c(paste(attr, length(new.levels), 'of new levels, e.g.'), head(new.levels, 2)))
      levels(testing[[attr]]) <- union(levels(testing[[attr]]), levels(training[[attr]]))
    }
  }
}

Ini juga mencetak atribut mana yang diubah. Saya tidak menemukan cara yang baik untuk menulisnya dengan lebih elegan (dengan ldply atau sesuatu). Setiap tips sangat dihargai.

pengguna41330
sumber
4

Berikut adalah beberapa kode yang saya tulis yang membahas tanggapan @ King di atas. Ini memperbaiki kesalahan:

# loops through factors and standardizes the levels
for (f in 1:length(names(trainingDataSet))) {
    if (levels(testDataSet[,f]) > levels(trainingDataSet[,f])) {    
            levels(testDataSet[,f]) = levels(trainingDataSet[,f])       
    } else {
            levels(trainingDataSetSMOTEpred[,f]) = levels(testDataSet[,f])      
    }
}
lfarb
sumber
hai @ ifarb, saya mencoba memahami solusi Anda: apa trainingDataSetSMOTEpred dan di mana itu didefinisikan dalam kode?
Kasia Kulma
3

Set tes dan pelatihan harus digabungkan sebagai satu set dan kemudian mengubah level set pelatihan. Kode saya adalah:

totalData <- rbind(trainData, testData)
for (f in 1:length(names(totalData))) {
  levels(trainData[, f]) <- levels(totalData[, f])
}

Ini berfungsi dalam setiap kasus di mana jumlah level dalam ujian lebih atau kurang dari pelatihan.

Kode Li
sumber
2

Saya memiliki solusi yang buruk ketika saya menggunakan randomForest di R. Ini mungkin tidak secara teoritis terdengar, tetapi hal itu berjalan.

levels(testSet$Cat_2) = levels(trainingSet$Cat_2)

atau sebaliknya. Pada dasarnya, itu hanya memberi tahu R bahwa itu adalah nilai yang valid hanya ada 0 kasus; jadi berhentilah menggangguku tentang kesalahan.

Saya tidak cukup pintar untuk mengkodekannya sehingga secara otomatis melakukan tindakan untuk semua fitur kategorikal. Kirimkan saya kode jika Anda tahu caranya ...

Raja
sumber
Tetapi ini tidak akan berhasil jika jumlah level dalam ujian lebih dari sekadar pelatihan. Ini hanya berfungsi jika tingkat faktor data uji <= tingkat faktor data pelatihan.
KarthikS
1

Saya yakin Anda sudah memikirkan hal ini jika ini masalahnya, tetapi jika set tes memiliki nilai aktual dan Anda menggunakan set tes untuk tujuan validasi silang, kemudian membelah ulang kerangka data menjadi pelatihan dan kerangka data uji di mana keduanya seimbang pada faktor-faktor ini akan menghindari masalah Anda. Metode ini dikenal sebagai validasi silang bertingkat .

goldisfine
sumber