Prediksi dengan randomForest (R) ketika beberapa input memiliki nilai yang hilang (NA)

9

Saya memiliki randomForestmodel klasifikasi yang baik yang ingin saya gunakan dalam aplikasi yang memprediksi kelas kasus baru. Kasing baru memiliki nilai yang pasti hilang. Prediksi tidak akan berfungsi seperti itu untuk NAS. Bagaimana saya harus melakukan ini?

data(iris)
# create first the new case with missing values
na.row<-45
na.col<-c(3,5)
case.na<-iris[na.row,]
case.na[,na.col]<-NA

iris.rf <- randomForest(Species ~ ., data=iris[-na.row,])
# print(iris.rf)

myrf.pred <- predict(iris.rf, case.na[-5], type="response")
myrf.pred
[1] <NA>

Saya mencoba missForest. Saya menggabungkan data asli dan case baru, mengocoknya dengan missForest, dan mendapatkan nilai imputasi untuk NAS dalam case baru saya. Komputasi terlalu berat.

data.imp <- missForest(data.with.na)

Tetapi harus ada cara untuk menggunakan rf-model untuk memprediksi kasus baru dengan nilai yang hilang, kan?

hermo
sumber
4
Ada banyak cara nilai yang hilang dapat ditangani di pohon keputusan, tetapi randomForestpaket di R hanya memiliki metode imputasi yang Anda gambarkan. Jika Anda ingin tetap berada di lingkungan yang sama, gbmmemiliki metode yang agak halus untuk menangani nilai yang hilang dalam data baru (itu tidak sempurna, tetapi bermanfaat).
Shea Parkes
Saya pikir paket partai lebih baik dengan nilai
Simone
Dear @Simone, bagaimana cara partykerja paket dengan NAS pada set tes? Saya tidak dapat menemukan jejak penerapan dalam partymanual atau contoh.
hermo
@hermo mencoba untuk melihat kertas partai citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.92.9930 tampaknya algoritme itu bekerja seperti CART - ia mencari pembelahan pengganti.
Simone
Coba gunakan "na.action = na.roughfix".

Jawaban:

1

Anda tidak punya pilihan selain menyalahkan nilai atau mengubah model. Pilihan yang bagus bisa berupa output dalam paket Hmisc. Saya pikir itu kurang berat daripada rfimpute yang merupakan apa yang menahan Anda, contoh paket pertama (ada yang lain):

# Check that aregImpute can almost exactly estimate missing values when
# there is a perfect nonlinear relationship between two variables
# Fit restricted cubic splines with 4 knots for x1 and x2, linear for x3
set.seed(3)
x1 <- rnorm(200)
x2 <- x1^2
x3 <- runif(200)
m <- 30
x2[1:m] <- NA
a <- aregImpute(~x1+x2+I(x3), n.impute=5, nk=4, match='closest')
a
matplot(x1[1:m]^2, a$imputed$x2)
abline(a=0, b=1, lty=2)

x1[1:m]^2
a$imputed$x2

# Multiple imputation and estimation of variances and covariances of
# regression coefficient estimates accounting for imputation
# Example 1: large sample size, much missing data, no overlap in
# NAs across variables
x1 <- factor(sample(c('a','b','c'),1000,TRUE))
x2 <- (x1=='b') + 3*(x1=='c') + rnorm(1000,0,2)
x3 <- rnorm(1000)
y  <- x2 + 1*(x1=='c') + .2*x3 + rnorm(1000,0,2)
orig.x1 <- x1[1:250]
orig.x2 <- x2[251:350]
x1[1:250] <- NA
x2[251:350] <- NA
d <- data.frame(x1,x2,x3,y)
# Find value of nk that yields best validating imputation models
# tlinear=FALSE means to not force the target variable to be linear
f <- aregImpute(~y + x1 + x2 + x3, nk=c(0,3:5), tlinear=FALSE,
                data=d, B=10) # normally B=75
f
# Try forcing target variable (x1, then x2) to be linear while allowing
# predictors to be nonlinear (could also say tlinear=TRUE)
f <- aregImpute(~y + x1 + x2 + x3, nk=c(0,3:5), data=d, B=10)
f

# Use 100 imputations to better check against individual true values
f <- aregImpute(~y + x1 + x2 + x3, n.impute=100, data=d)
f
par(mfrow=c(2,1))
plot(f)
modecat <- function(u) {
 tab <- table(u)
 as.numeric(names(tab)[tab==max(tab)][1])
}
table(orig.x1,apply(f$imputed$x1, 1, modecat))
par(mfrow=c(1,1))
plot(orig.x2, apply(f$imputed$x2, 1, mean))
fmi <- fit.mult.impute(y ~ x1 + x2 + x3, lm, f, 
                       data=d)
sqrt(diag(vcov(fmi)))
fcc <- lm(y ~ x1 + x2 + x3)
summary(fcc)   # SEs are larger than from mult. imputation

Anda menyebutkan bahwa Anda memiliki banyak pengamatan baru yang memiliki nilai yang hilang pada variabel independen. Meskipun Anda memiliki banyak kasus seperti ini, jika untuk setiap pengamatan baru hanya ada satu atau dua variabel yang hilang dan jumlah variabel Anda tidak kecil, mungkin hanya mengisi lubang dengan median atau rata-rata (apakah terus menerus?) bisa bekerja.

Hal lain yang mungkin menarik adalah melakukan analisis kepentingan variabel minor. Implementasi R hutan acak menghitung dua langkah penting dan plot masing-masing:

varImpPlot(yourRandomForestModel) # yourRandomForestModel must have the argument importance=TRUE 

Dan Anda dapat bermain-main hanya dengan memasukkan variabel "penting" dalam pelatihan model, hingga akurasi prediksi tidak terlalu terpengaruh dibandingkan dengan "model penuh". Mungkin Anda menyimpan variabel dengan jumlah kesalahan yang rendah. Ini bisa membantu Anda mengurangi ukuran masalah Anda.

JEquihua
sumber