2013-06-20 14 views
6

Pracuję nad konkursem Kaggle Titanic i mam pytanie dotyczące przypisywania brakujących wartości. Próbuję użyć pakietu Caret, a mój zestaw treningowy składa się zarówno z czynników, jak i liczb.Impute Missing Values ​​with Caret

Chcę użyć funkcji preProcess w Caret, aby przypisać brakujące wartości, ale przed użyciem preProcess, muszę przekonwertować wszystkie moje czynniki na fałszywe zmienne za pomocą funkcji dummyVars.

dummies = dummyVars(survived ~ . -1, data = train, na.action = na.pass) 
xtrain = predict(dummies, train) 

Jednak w trakcie korzystania dummyVars przekonwertować czynniki, wszystkie NAS są przewidywane przez jakiegoś nieznanego algorytmu i brakujące age kolumny wszystkich stać 1-choć określono na.action = na.pass. Chcę zamienić moje czynniki na fałszywe zmienne BEZ dotknięcia NA, więc mogę użyć funkcji preProcess, aby je przypisać. Jak mogę to zrobić?

Dziękuję.

dput tutaj:

structure(list(survived = structure(c(1L, 2L, 2L, 2L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("0", 
"1"), class = "factor"), pclass = structure(c(3L, 1L, 3L, 1L, 
3L, 3L, 1L, 3L, 3L, 2L, 3L, 1L, 3L, 3L, 3L, 2L, 3L, 2L, 3L, 3L 
), .Label = c("1", "2", "3"), class = "factor"), sex = structure(c(2L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 
2L, 1L, 1L), .Label = c("female", "male"), class = "factor"), 
    age = c(22, 38, 26, 35, 35, NA, 54, 2, 27, 14, 4, 58, 20, 
    39, 14, 55, 2, NA, 31, NA), sibsp = c(1, 1, 0, 1, 0, 0, 0, 
    3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 0, 1, 0), parch = c(0, 0, 0, 
    0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0, 0), fare = c(7.25, 
    71.2833, 7.925, 53.1, 8.05, 8.4583, 51.8625, 21.075, 11.1333, 
    30.0708, 16.7, 26.55, 8.05, 31.275, 7.8542, 16, 29.125, 13, 
    18, 7.225), embarked = structure(c(4L, 2L, 4L, 4L, 4L, 3L, 
    4L, 4L, 4L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 4L, 4L, 2L), .Label = c("", 
    "C", "Q", "S"), class = "factor")), .Names = c("survived", 
"pclass", "sex", "age", "sibsp", "parch", "fare", "embarked"), row.names = c(NA, 
20L), class = "data.frame") 

Odpowiedz

4

Ta pierwsza część jest błąd; wartości NA nie powinny być równe 1 (oczywiście). W międzyczasie możesz użyć model.matrix do wygenerowania zmiennych fikcyjnych, ale może być konieczne zrobienie tego jednocześnie dla wszystkich danych. Ponadto, jeśli używasz train, możesz użyć metody formuły. Ogólnie rzecz biorąc, jest to lepsze podejście.

Naprawię to w ciągu najbliższych kilku tygodni. Mam zamiar wydać wersję karetki i to, plus UseR, trochę mnie opóźni.

EDIT: nowa wersja zostanie wydana w przyszłym tygodniu, który poprawia buga

Max

+1

Dzięki za odpowiedź. 'model.matrix' również nie działa, ponieważ pomija wszystkie wiersze z NA. Daj mi znać, jeśli istnieje sposób, aby to zadziałało. Dzięki. – mchangun