Prognozowanie za pomocą randomForest (R), gdy na niektórych wejściach brakuje wartości (NA)

9

Mam dokładny randomForestmodel klasyfikacji, którego chciałbym użyć w aplikacji, która przewiduje klasę nowego przypadku. W nowym przypadku nieuchronnie brakuje wartości. Prognozy nie będą działać jako takie dla NA. Jak mam to zrobić?

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>

Próbowałem missForest. Połączyłem oryginalne dane i nowy przypadek, potrząsnąłem nim missForesti otrzymałem kalkulacyjne wartości dla NA w moim nowym przypadku. Jednak zbyt ciężkie przetwarzanie.

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

Ale musi istnieć sposób na wykorzystanie modelu RF do przewidywania nowego przypadku z brakującymi wartościami, prawda?

hermo
źródło
4
Istnieje wiele sposobów radzenia sobie z brakującymi wartościami w drzewach decyzyjnych, ale randomForestpakiet w R ma tylko opisaną metodę imputacji. Jeśli chcesz pozostać w podobnym środowisku, gbmma nieco płynniejszą metodę obsługi brakujących wartości w nowych danych (nie jest to idealne, ale jest przydatne).
Shea Parkes,
Myślę, że ten pakiet imprezowy lepiej radzi sobie z brakującymi wartościami
Simone
Drogi @ Simone, jak partypakiet działa z NA w zestawie testowym? Nie mogłem znaleźć śladu przypisywania w partyinstrukcjach lub przykładach.
hermo
@hermo spróbować spojrzeć na papierze partii citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.92.9930 Wydaje się, że algorytm działa jak CART - szuka zastępczych rozłamów.
Simone
Spróbuj użyć „na.action = na.roughfix”.

Odpowiedzi:

1

Nie masz wyboru, musisz przypisać wartości lub zmienić modele. Dobrym wyborem może być aregImpute w pakiecie Hmisc. Myślę, że jest mniej ciężki niż rfimpute, co Cię zatrzymało, przykład pierwszego pakietu (są inne):

# 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

Wspominasz, że masz wiele nowych obserwacji, w których brakuje wartości niezależnych zmiennych. Chociaż masz wiele takich przypadków, jeśli dla każdej nowej obserwacji brakuje tylko jednej lub dwóch zmiennych, a twoja liczba zmiennych nie jest niewielka, może po prostu wypełniasz dziury medianą lub średnią (czy są one ciągłe?) powinno działać.

Inną rzeczą, która może być interesująca, jest analiza drobnych zmian ważności. Losowa implementacja lasu R oblicza dwie miary ważności i odpowiednie wykresy:

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

Możesz się bawić z włączeniem „ważnych” zmiennych do treningu modelu, dopóki dokładność prognoz nie wpłynie na to w porównaniu z „pełnym modelem”. Może trzymasz zmienne z małą liczbą braków. Może to pomóc w zmniejszeniu rozmiaru problemu.

JEquihua
źródło