Vorhersage mit randomForest (R), wenn bei einigen Eingaben Werte fehlen (NA)

9

Ich habe ein feines randomForestKlassifizierungsmodell, das ich in einer Anwendung verwenden möchte, die die Klasse eines neuen Falls vorhersagt. Dem neuen Fall fehlen zwangsläufig Werte. Predict funktioniert als solches für NAs nicht. Wie soll ich das dann machen?

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>

Ich habe es versucht missForest. Ich habe die Originaldaten und den neuen Fall kombiniert, mit ihnen missForestgeschüttelt und in meinem neuen Fall unterstellte Werte für NAs erhalten. Zu viel Computer.

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

Aber es muss eine Möglichkeit geben, das RF-Modell zu verwenden, um einen neuen Fall mit fehlenden Werten vorherzusagen, oder?

Hermo
quelle
4
Es gibt viele Möglichkeiten, wie fehlende Werte in Entscheidungsbäumen behandelt werden können, aber das randomForestPaket in R verfügt nur über die von Ihnen beschriebene Imputationsmethode. Wenn Sie in einer ähnlichen Umgebung bleiben möchten, gbmhaben Sie eine etwas flüssigere Methode, um fehlende Werte in neuen Daten zu behandeln (es ist nicht perfekt, aber es ist nützlich).
Shea Parkes
Ich denke, dass Party- Paket besser mit fehlenden Werten
Simone
Sehr geehrte @ Simone, wie funktioniert das partyPaket mit NAs im Testset? Ich konnte in partyHandbüchern oder Beispielen keine Spur von Zuschreibungen finden .
Hermo
@hermo versuchen, einen Blick auf das Papier der Partei zu werfen citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.92.9930 Es scheint, dass der Algorithmus wie CART funktioniert - er sucht nach Ersatzsplits .
Simone
Versuchen Sie es mit "na.action = na.roughfix".

Antworten:

1

Sie haben keine andere Wahl, als die Werte zu unterstellen oder Modelle zu ändern. Eine gute Wahl könnte aregImpute im Hmisc-Paket sein. Ich denke, es ist weniger schwer als rfimpute, was Sie festhält, erstes Paketbeispiel (es gibt andere):

# 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

Sie erwähnen, dass Sie viele neue Beobachtungen haben, bei denen Werte für die unabhängigen Variablen fehlen. Auch wenn Sie viele Fälle wie diesen haben, wenn für jede neue Beobachtung nur eine oder zwei ihrer Variablen fehlen und Ihre Anzahl von Variablen nicht winzig ist, füllen Sie möglicherweise nur die Löcher mit einem Median oder Durchschnitt (sind sie kontinuierlich?) könnte klappen.

Eine andere Sache, die interessant sein könnte, ist eine geringfügige Analyse der variablen Wichtigkeit. Die zufällige Forest R-Implementierung berechnet zwei Wichtigkeitsmaße und entsprechende Diagramme:

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

Und Sie können damit herumspielen, nur "wichtige" Variablen in das Modelltraining einzubeziehen, bis die Vorhersagegenauigkeit im Vergleich zum "vollständigen Modell" nicht mehr so ​​stark beeinträchtigt ist. Vielleicht behalten Sie Variablen mit einer geringen Anzahl von Fehlern. Dies könnte Ihnen helfen, die Größe Ihres Problems zu verringern.

JEquihua
quelle