2013-12-12 15 views
6

Robię modelowanie za pomocą pakietu randomForest. Funkcja rfImpute jest bardzo dobra do obsługi brakujących wartości podczas dopasowywania modelu. Czy istnieje jednak sposób, aby uzyskać przewidywania dla nowych przypadków, które mają brakujące wartości?Uzyskiwanie prognoz po rfImpute

Poniższy przykład oparty jest na przykładzie z ?rfImpute.

iris.na <- iris 

set.seed(111) 
## artificially drop some data values. 
for (i in 1:4) iris.na[sample(150, sample(20)), i] <- NA 

## impute the dropped values 
set.seed(222) 
iris.imputed <- rfImpute(Species ~ ., iris.na) 

## fit the model 
set.seed(333) 
iris.rf <- randomForest(Species ~ ., iris.imputed) 

# now try to predict for a case where a variable is missing 
> predict(iris.rf, iris.na[148, , drop=FALSE]) 
[1] <NA> 
Levels: setosa versicolor virginica 

Odpowiedz

1

cztery lata i jeden Firma później ....

Funkcja rxDForest dostarczana z serwerem/klientem Microsoft R może uzyskać przewidywane wartości dla przypadków z brakującymi wartościami. Dzieje się tak, ponieważ rxDForest używa tego samego kodu źródłowego, co rxDTree do dopasowywania pojedynczych drzew decyzyjnych, a zatem korzysta z możliwości tworzenia przez te zmienne zastępcze.

iris.na <- iris 

set.seed(111) 
## artificially drop some data values. 
for (i in 1:4) iris.na[sample(150, sample(20)), i] <- NA 


library(RevoScaleR) 

# rxDForest doesn't support dot-notation for formulas 
iris.rxf <- rxDForest(Species ~ Petal.Length + Petal.Width + Sepal.Length + Sepal.Width, 
    data=iris.na, nTree=100) 

pred <- rxPredict(iris.rxf, iris.na) # not predict() 

table(pred) 
# setosa versicolor virginica 
#  50   48   52 

(Odpowiedź przez @alex Keil, natomiast pomysłowe, nie jest bardzo praktyczne w warunkach produkcji, ponieważ wymaga montażu model dla każdego wywołania predykcji. Z przyzwoitej wielkości zbioru danych, który może potrwać kilka minut lub godzin.)

+0

Cieszę się, że wymyślił lepszy sposób, aby to zrobić! Dziękuję za zgłoszenie. –

8

To prawdopodobnie nie jest czyste rozwiązanie, którego szukasz, ale tutaj jest droga naprzód. Problem jest dwojaki:

1) wartość zmiennych NA musi być przypisana na podstawie tego samego protokołu imputacji, w ramach którego zostały utworzone oryginalne dane.

2) wynik należy przewidzieć na podstawie tej przypisanej wartości, ale zgodnie z pierwotnym losowym lasem bez nowych danych.

1:

Tack na nowej obserwacji do kalkulacyjnych (zamiast oryginału) zbioru danych (tj Wykorzystaj dane kalkulacyjne już masz) i przypisać nowe wartości brakujących. Nowa wartość nie pasuje do imputacji z pierwotnej obserwacji (nie powinna).

 
iris.na2 = rbind(iris.imputed, iris.na[148, , drop=FALSE]) 
iris.imputed2 = rfImpute(Species ~ ., iris.na2) 
 
>>>tail(iris.imputed,3) 
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
148 virginica   6.5 3.019279   5.2   2.0 
149 virginica   6.2 3.400000   5.4   2.3 
150 virginica   5.9 3.000000   5.1   1.8 
>>>tail(iris.imputed2,4) 
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
148 virginica   6.5 3.019279   5.2   2.0 
149 virginica   6.2 3.400000   5.4   2.3 
150 virginica   5.9 3.000000   5.1   1.8 
1481 virginica   6.5 3.023392   5.2   2.0 

2:

Predict nowo przypisać obserwacji z wykorzystaniem informacji z oryginalnego losowej lasu.

 
predict(iris.rf, iris.imputed2[151, ]) 
    1481 
virginica 
Levels: setosa versicolor virginica 

Nie będzie problemów z wariancji, ponieważ nie są w tym niepewność w użyciu niejawny zarzucanych dane przypisać kolejny punkt danych. Jednym ze sposobów obejścia tego jest bootstrap.

To działa, jeśli zmienna zależna brakuje też (przewidzieć nie dba o zmiennej zależnej, więc można po prostu dać macierz niezależnych zmiennych, zbyt):

 
>>>missY = cbind(NA,iris.imputed2[151, 2:5]) 
>>>missY 
    NA Sepal.Length Sepal.Width Petal.Length Petal.Width 
1481 NA   6.5 3.023392   5.2   2 

>>>predict(iris.rf,missY) 
    1481 
virginica 
Levels: setosa versicolor virginica 
Powiązane problemy