R caret dan NAs

26

Saya sangat suka caret karena kemampuan penyetelan parameter dan antarmuka yang seragam, tetapi saya telah mengamati bahwa selalu membutuhkan set data lengkap (yaitu tanpa NAS) bahkan jika model "telanjang" yang diterapkan memungkinkan NAs. Itu sangat merepotkan, mengingat seseorang harus menerapkan metode imputasi kerja, yang pada awalnya tidak diperlukan. Bagaimana seseorang bisa menghindari tuduhan dan masih menggunakan keunggulan caret?

Fredrik
sumber
3
Anda selalu harus melakukan sesuatu dengan nilai yang hilang. Saya harus mengatakan saya tidak benar-benar memahami pertanyaan Anda - Anda mencari pendekatan satu ukuran untuk semua ..? Jika Anda tidak ingin memasukkan NAS, lalu apa yang ingin Anda lakukan dengannya? Menghapus?
Tim
1
Saya ingin meninggalkan NAS di sana dan menyerahkannya pada model untuk mengatasi NAs. Jika saya melakukannya dengan fungsi C5.0 di C50, misalnya, ia dapat mengatasi NAS itu sendiri, tetapi dalam hal ini saya tidak dapat menggunakan caret, karena fungsi kereta caret memungkinkan tidak ada NAS dalam dataset bahkan ketika saya ingin menggunakan C5. 0 fungsi C50 yang disebutkan di atas.
Fredrik
3
Tapi apa yang "model" lakukan adalah mengabaikan (menghapus) data ini dan meninggalkan Anda dengan sampel yang lebih kecil; itu memperkirakan (menyiratkan) nilai-nilai itu; atau memprediksi kategori "NA" (misalnya dalam beberapa model berbasis pohon). Apa lagi yang ingin Anda "model" lakukan? Beberapa perangkat lunak melakukan hal-hal itu untuk Anda secara otomatis, tetapi bayangkan mesin kopi Anda memberi Anda kopi "default" ... Beberapa perangkat lunak membuat "kopi default" dari NAS, tetapi itu bukan yang terbaik yang bisa Anda dapatkan.
Tim
3
Apakah Anda yakin tanda sisipan tidak mengizinkan NAs? Saya sudah mencoba memperkenalkan NA dengan contoh default di halaman bantuan kereta dan dengan metode kereta C5.0 bekerja dengan baik. Gagal dengan hutan acak.
mpiktas

Jawaban:

32

Untuk fungsi kereta di caret, Anda dapat melewatkan parameter na.action = na.pass, dan tanpa preprocessing (jangan tentukan preProcess, biarkan sebagai nilai default NULL). Ini akan meneruskan nilai-nilai NA yang tidak dimodifikasi secara langsung ke fungsi prediksi (ini akan menyebabkan fungsi prediksi yang tidak mendukung nilai-nilai yang hilang gagal, bagi mereka Anda perlu menentukan preProcess untuk menghitung nilai-nilai yang hilang sebelum memanggil fungsi prediksi). Sebagai contoh:

train(formula,
      dataset,
      method = "C5.0",
      na.action = na.pass)

Dalam hal ini, C5.0 akan menangani nilai yang hilang dengan sendirinya.

Stan Hatko
sumber
1
Ini diskusi yang menarik. Apa jebakan menambahkan NA sebagai tingkat lain ke prediktor kategoris? Jika NAS tidak dapat dimodelkan atau diperhitungkan, yaitu keberadaan suatu absen sebenarnya informatif, akan terlihat bahwa membuat NA sebagai level tambahan masuk akal?
Seanosapien
Jika seseorang menggunakan x, spesifikasi y dalam trainmemiliki na.action = na.passset opsi akan menyebabkan kesalahan berikut:Something is wrong; all the RMSE metric values are missing
user29609
3

Sudahkah Anda mencoba pengodean ulang NAS? Sesuatu> 3 standar deviasi di luar data Anda (misalnya -12345) harus mendorong C5.0 untuk memprediksi secara terpisah, seperti halnya dengan NAS.

psikonomi
sumber
2

Saya pikir solusi Anda akan menyalahkan nilai-nilai saat menggunakan fungsi predict () .

Lihat ?predict.trainuntuk lebih jelasnya.

Anda dapat menggunakan na.omitagar tanda sisipan untuk menilai nilai. Sebagai contoh:

    ## S3 method for class 'train':
    predict((object, newdata = NULL, type = "raw", na.action = na.omit, ...)

dari http://www.inside-r.org/packages/cran/caret/docs/predict.train

Solusi lain adalah menyalahkan saat preprocessing data:

    ## S3 method for class 'default':
    preProcess(x, 
       method = "knnImpute",   # or *bagImpute* / *medianImpute*
       pcaComp = 10,
       na.remove = TRUE,
       k = 5,
       knnSummary = mean,
       outcome = NULL,
       fudge = .2,
       numUnique = 3,
       verbose = TRUE,
       )

dari http://www.inside-r.org/node/86978

Kristijan
sumber