R caret i NA

26

Bardzo wolę dbać o jego zdolność do dostrajania parametrów i jednolity interfejs, ale zauważyłem, że zawsze wymaga kompletnych zestawów danych (tj. Bez NA), nawet jeśli zastosowany model „nagi” pozwala NA. Jest to bardzo uciążliwe, ponieważ należy stosować pracochłonne metody imputacji, które w pierwszej kolejności nie są konieczne. Jak można uniknąć przypisania i nadal korzystać z przewagi karetki?

Fredrik
źródło
3
Zawsze musisz zrobić coś z brakującymi wartościami. Muszę powiedzieć, że tak naprawdę nie rozumiem twojego pytania - szukasz jednego uniwersalnego podejścia…? Jeśli nie chcesz przypisywać NA, co chcesz z nimi zrobić? Kasować?
Tim
1
Chcę zostawić tam NA i pozostawić to modelowi, aby poradził sobie z NA. Na przykład, jeśli zrobię to z funkcją C5.0 w C50, może poradzić sobie z samymi NA, ale w tym przypadku nie mogę użyć daszka, ponieważ funkcja pociągu daszek nie dopuszcza żadnych NA w zestawach danych, nawet gdy chcę użyć C5. 0 funkcja C50 wspomniana powyżej.
Fredrik,
3
Ale to, co robi „model”, to ignoruje (usuwa) te dane, pozostawiając mniejszą próbkę; szacuje (przypisuje) te wartości; lub przewiduje kategorię „NA” (np. w niektórych modelach opartych na drzewach). Co jeszcze chciałbyś zrobić w swoim „modelu”? Niektóre programy wykonują te czynności automatycznie, ale wyobraź sobie, że twój ekspres do kawy dał ci „domyślną” kawę… Niektóre programy produkują „domyślną kawę” z NA, ale nie jest to najlepsze, co możesz uzyskać.
Tim
3
Czy jesteś pewien, że karetka nie pozwala NA? Próbowałem wprowadzić NA z domyślnym przykładem na stronie pomocy pociągu i przy metodzie C5.0 pociąg działał dobrze. Nie udało się z losowym lasem.
mpiktas,

Odpowiedzi:

32

Do funkcji pociągu w karetce możesz przekazać parametr na.action = na.pass i bez przetwarzania wstępnego (nie określaj preProcess, pozostaw jako domyślną wartość NULL). Spowoduje to przekazanie niezmodyfikowanych wartości NA bezpośrednio do funkcji predykcji (spowoduje to, że funkcje predykcji, które nie obsługują brakujących wartości, zawiodą, ponieważ przed wywołaniem funkcji predykcji konieczne byłoby określenie preProcess w celu przypisania brakujących wartości). Na przykład:

train(formula,
      dataset,
      method = "C5.0",
      na.action = na.pass)

W takim przypadku C5.0 sam poradzi sobie z brakującymi wartościami.

Stan Hatko
źródło
1
To ciekawa dyskusja. Jaki byłby problem z dodaniem NA jako kolejnego poziomu do predyktora jakościowego? Jeśli NA nie można modelować ani przypisywać, tj. Obecność nieobecności ma w rzeczywistości charakter informacyjny, wydaje się, że zwykłe uczynienie NA dodatkowym poziomem ma sens?
Seanosapien
Jeśli używa się specyfikacji x, y trainprzy ustawieniu na.action = na.passopcji spowoduje następujący błąd:Something is wrong; all the RMSE metric values are missing
user29609
3

Próbowałeś przekodować NA? Coś> 3 odchylenia standardowe poza Twoimi danymi (np. -12345) powinno zachęcić C5.0 do przewidzenia ich osobno, podobnie jak w przypadku NA.

psychonomia
źródło
2

Myślę, że twoim rozwiązaniem byłoby przypisanie wartości podczas korzystania z funkcji predykcji () .

Zobacz ?predict.trainpo więcej szczegółów.

Możesz użyć, na.omitaby umożliwić karetce przypisanie wartości. Na przykład:

    ## S3 method for class 'train':
    predict((object, newdata = NULL, type = "raw", na.action = na.omit, ...)

z http://www.inside-r.org/packages/cran/caret/docs/predict.train

Innym rozwiązaniem byłoby przypisanie podczas wstępnego przetwarzania danych:

    ## S3 method for class 'default':
    preProcess(x, 
       method = "knnImpute",   # or *bagImpute* / *medianImpute*
       pcaComp = 10,
       na.remove = TRUE,
       k = 5,
       knnSummary = mean,
       outcome = NULL,
       fudge = .2,
       numUnique = 3,
       verbose = TRUE,
       )

z http://www.inside-r.org/node/86978

Kristijan
źródło