Previsione con randomForest (R) quando alcuni input hanno valori mancanti (NA)


9

Ho un randomForestmodello di classificazione che vorrei utilizzare in un'applicazione che prevede la classe di un nuovo caso. Il nuovo caso ha inevitabilmente valori mancanti. Predict non funzionerà come tale per i NA. Come dovrei farlo allora?

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>

Ci ho provato missForest. Ho combinato i dati originali e il nuovo caso, l'ho scosso missForeste ho ottenuto valori imputati per i NA nel mio nuovo caso. Elaborazione troppo pesante però.

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

Ma ci deve essere un modo per usare il modello rf per prevedere un nuovo caso con valori mancanti, giusto?


4
Esistono molti modi in cui i valori mancanti possono essere gestiti negli alberi delle decisioni, ma il randomForestpacchetto in R ha solo il metodo di imputazione descritto. Se vuoi rimanere in un ambiente simile, gbmha un metodo un po 'più fluido per gestire i valori mancanti nei nuovi dati (non è perfetto, ma è utile).
Shea Parkes,

Penso che il pacchetto del partito gestisca meglio i valori mancanti
Simone,

Caro @Simone, come funziona il partypacchetto con le NA nel set di test? Non sono riuscito a trovare traccia dell'imputazione in partymanuali o esempi.
hermo,

@hermo prova a dare un'occhiata al documento del partito citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.92.9930 sembra che l'algoritmo funzioni come CART - cerca spaccature surrogate.
Simone

Prova a utilizzare "na.action = na.roughfix".

Risposte:


1

Non hai altra scelta che imputare i valori o cambiare i modelli. Una buona scelta potrebbe essere aregImpute nel pacchetto Hmisc. Penso che sia meno pesante di rfimpute che è ciò che ti trattiene, primo esempio di pacchetto (ce ne sono altri):

# 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

Dici che hai molte nuove osservazioni che hanno valori mancanti sulle variabili indipendenti. Anche se hai molti casi come questo, se per ogni nuova osservazione ci sono solo mancanze in una o due delle sue variabili e la tua quantità di variabili non è minuscola forse riempie i buchi con una mediana o una media (sono continui?) potrebbe funzionare.

Un'altra cosa che potrebbe essere interessante è fare un'analisi di importanza variabile minore. L'implementazione casuale della foresta R calcola due misure di importanza e i rispettivi grafici:

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

E puoi giocare semplicemente includendo variabili "importanti" nell'addestramento del modello, fino a quando l'accuratezza della previsione non è affatto influenzata rispetto al "modello completo". Forse mantieni le variabili con un basso numero di mancanze. Potrebbe aiutarti a ridurre le dimensioni del tuo problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.