Bazı girdilerin eksik değerleri (NA) olduğunda randomForest (R) ile tahmin


9

randomForestYeni bir vakanın sınıfını öngören bir uygulamada kullanmak istediğim iyi bir sınıflandırma modelim var. Yeni vaka kaçınılmaz olarak eksik değerlere sahip. Tahmin NA'lar için böyle çalışmaz. Bunu nasıl yapmalıyım?

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>

Denedim missForest. Orijinal verileri ve yeni vakayı birleştirdim, çalkaladım missForestve yeni davamda NA'lar için empoze edilmiş değerler aldım. Yine de çok ağır bilgi işlem.

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

Fakat eksik değerlere sahip yeni bir durum öngörmek için rf-modelini kullanmanın bir yolu olmalı, değil mi?


4
Eksik değerlerin karar ağaçlarında işlenmesinin birçok yolu vardır, ancak randomForestR'deki paketin yalnızca tanımladığınız imputation yöntemi vardır. Benzer bir ortamda kalmak istiyorsanız gbm, yeni verilerdeki eksik değerleri işlemek için biraz daha yumuşak bir yöntem vardır (mükemmel değildir, ancak yararlıdır).
Shea Parkes

Bence parti paketi eksik değerlerle daha iyi
Simone

Sevgili @Simone, partypaket test setindeki NA'larla nasıl çalışır? partyKılavuzlarda veya örneklerde zımni bir iz bulamadım .
hermo

@hermo partinin kağıt bakmak için denemek citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.92.9930 o CART gibi algoritma çalışır görünüyor - bu vekil böler arar.
Simone

"Na.action = na.roughfix" kullanmayı deneyin.

Yanıtlar:


1

Değerleri etkilemek veya modelleri değiştirmek dışında bir seçeneğiniz yoktur. İyi bir seçim Hmisc paketinde aregImpute olabilir. Seni gözaltına alan şey olan rfimpute'den daha az ağır olduğunu düşünüyorum, ilk paket örneği (diğerleri var):

# 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

Bağımsız değişkenler üzerinde eksik değerleri olan birçok yeni gözleminiz olduğunu belirtiyorsunuz. Böyle birçok vakanız olmasına rağmen, her yeni gözlem için değişkenlerinin bir veya ikisinde sadece eksikler varsa ve değişken miktarınız küçük değil, belki sadece delikleri bir medyan veya ortalama ile dolduruyor (sürekli mi?) işe yarayabilir.

İlginç olabilecek başka bir şey de küçük değişken önem analizi yapmaktır. Rastgele orman R uygulaması iki önemli önlemi ve ilgili grafikleri hesaplar:

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

Ve tahmin doğruluğu "tam modele" kıyasla sadece etkilenmeyene kadar model eğitimine sadece "önemli" değişkenleri dahil ederek oynayabilirsiniz. Belki de az sayıda eksiklik içeren değişkenleri tutarsınız. Sorununuzun boyutunu azaltmanıza yardımcı olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.