Bagaimana cara menyalahkan variabel prediktor kategori yang hilang untuk model hutan acak?

8

Saya memiliki satu set data x, y yang saya gunakan untuk membangun hutan acak. Data x adalah vektor nilai yang mencakup beberapa NAS. Jadi saya gunakan rfImputeuntuk menangani data yang hilang dan membuat hutan acak. Sekarang saya memiliki observasi baru x yang tidak terlihat (dengan NA) dan saya ingin memprediksi y. Bagaimana cara menyalahkan nilai yang hilang sehingga saya dapat menggunakan hutan acak yang sudah saya tanam? The rfImputeFungsi tampaknya membutuhkan x dan y. Saya hanya punya x untuk keperluan prediksi.

Pertanyaan saya mirip (tetapi berbeda) dengan pertanyaan ini . Dan misalnya, saya bisa menggunakan set data iris yang sama. Jika saya telah benar menafsirkan kode dalam jawaban untuk pertanyaan yang saya referensi, kode iris.na[148, , drop=FALSE]dalam pernyataan tersebut iris.na2 = rbind(iris.imputed, iris.na[148, , drop=FALSE])mewakili data baru yang mencakup Species(nilai Y). Dalam masalah saya, saya tidak akan tahu - SpeciesSaya ingin menggunakan hutan acak untuk memprediksi itu. Saya akan memiliki 4 variabel independen, tetapi beberapa mungkin NAuntuk baris yang diberikan. Untuk melanjutkan analogi, bayangkan saya memiliki 3 dari 4 variabel (satu hilang). Saya ingin menyalahkan nilai itu. Lalu saya ingin memprediksi spesies yang saya tidak tahu.

Menanggapi komentar gung bahwa saya harus menambahkan ilustrasi, izinkan saya memasukkannya ke dalam set data iris. Bayangkan saya memiliki data bunga. Aku tahu itu Sepal.Length, Sepal.Width, Petal.Length, tapi bukan Petal.Width. Saya ingin menyalahkan Petal.Widthdan kemudian menggunakan 4 nilai tersebut dalam model RF untuk memprediksi Species.

rmacey
sumber
Apakah Anda mengatakan tidak punya apa - apa ? Anda mulai dengan hanya x & y untuk membuat model, & sekarang Anda ingin memprediksi y untuk pengamatan yang Anda tidak punya x atau y. Apakah itu benar?
gung - Reinstate Monica
gung, aku punya sesuatu. Saya punya observasi x baru tapi tidak y. Saya ingin memprediksi y berdasarkan x baru. Tetapi vektor x memiliki beberapa nilai NA yang saya ingin menyalahkan. Terima kasih.
rmacey
Saya mengerti, jadi x adalah seperangkat variabel prediktor di mana Anda memiliki beberapa tetapi tidak yang lain. Apakah itu benar? Anda mungkin ingin memperbarui Q Anda (yang akan menabraknya di halaman utama), & Anda mungkin ingin menyertakan contoh ilustrasi kecil. Satu catatan peringatan: Q ini terlihat di perbatasan 'bagaimana saya menggunakan R?' & / atau 'kode apa yang akan membantu saya melakukan ini?', yang akan dianggap sebagai program-y & dapat ditutup. Anda harus memastikan bahwa ini adalah pertanyaan tentang RF, bukan bagaimana melakukan RF dengan R.
gung - Reinstate Monica
LOL ... ketika saya menaruhnya di pertukaran tumpukan biasa, mereka menyarankan saya pindah ke sini. Ini benar-benar tentang rfImpute atau yang serupa.
rmacey
Dengan "pertukaran tumpukan biasa", maksud Anda Stack Overflow ? Jika pertanyaan Anda adalah bagaimana cara menggunakan kode, itu ada di sana; jika itu bagaimana memahami statistik yang mendasarinya, ini ada di sini. (Tentu saja, ada juga Q yang di luar topik di kedua tempat.) Saya tidak berpikir Q Anda di luar topik di sini. Saya hanya memberitahu Anda untuk berhati-hati bagaimana Anda mengucapkannya, jadi jelas bahwa itu adalah pertanyaan statistik, bukan pertanyaan pengkodean.
gung - Reinstate Monica

Jawaban:

4

Saya pikir Anda memerlukan metode imputasi yang tidak diawasi. Itu adalah salah satu yang tidak menggunakan nilai target untuk imputasi. Jika Anda hanya memiliki beberapa vektor fitur prediksi, mungkin sulit untuk mengungkap struktur data. Alih-alih, Anda bisa mencampur prediksi Anda dengan vektor fitur pelatihan yang sudah diperhitungkan dan menggunakan struktur ini untuk menyalahkan sekali lagi. Perhatikan prosedur ini dapat melanggar asumsi independensi, oleh karena itu bungkus seluruh prosedur dalam validasi silang luar untuk memeriksa overfitting yang serius.

Saya baru belajar tentang missForest dari komentar untuk pertanyaan ini . missForest tampaknya melakukan triknya. Saya mensimulasikan masalah Anda pada data iris. (tanpa validasi silang luar)

rm(list=ls())
data("iris")
set.seed(1234)
n.train = 100
train.index = sample(nrow(iris),n.train)
feature.train = as.matrix(iris[ train.index,1:4])
feature.test  = as.matrix(iris[-train.index,1:4])


#simulate 40 NAs in train
n.NAs = 40
NA.index = sample(length(feature.train),n.NAs)
NA.feature.train = feature.train; NA.feature.train[NA.index] = NA

#imputing 40 NAs unsupervised
library(missForest)
imp.feature.train = missForest(NA.feature.train)$ximp
#check how well imputation went, seems promsing for this data set
plot(    feature.train[NA.index],xlab="true value",
     imp.feature.train[NA.index],ylab="imp  value",)

#simulate random NAs in feature test
feature.test[sample(length(feature.test),20)] = NA

#mix feature.test with imp.feature.train
nrow.test = nrow(feature.test)
mix.feature = rbind(feature.test,imp.feature.train)
imp.feature.test = missForest(mix.feature)$ximp[1:nrow.test,]

#train RF and predict
library(randomForest)
rf = randomForest(imp.feature.train,iris$Species[train.index])
pred.test = predict(rf,imp.feature.test)
table(pred.test, iris$Species[-train.index])

Printing...
-----------------
pred.test    setosa versicolor virginica
  setosa         12          0         0
  versicolor      0         20         2
  virginica       0          1        15
Soren Havelund Welling
sumber