Pobieranie próbek z zamianą w R randomForest

11

Implementacja randomForest nie pozwala na pobieranie próbek poza liczbę obserwacji, nawet w przypadku pobierania próbek z wymianą. Dlaczego to?

Działa w porządku:

rf <- randomForest(Species ~ ., iris, sampsize=c(1, 1, 1), replace=TRUE)
rf <- randomForest(Species ~ ., iris, sampsize=3, replace=TRUE)

Co chcę robić:

rf <- randomForest(Species ~ ., iris, sampsize=c(51, 1, 1), replace=TRUE)
Error in randomForest.default(m, y, ...) : 
  sampsize can not be larger than class frequency

Podobny błąd bez próby warstwowej:

rf <- randomForest(Species ~ ., iris, sampsize=151, replace=TRUE)
Error in randomForest.default(m, y, ...) : sampsize too large

Ponieważ spodziewałem się, że metoda pobierze próbki bootstrapu, gdy otrzymam replace = TRUE w obu przypadkach, nie spodziewałem się tego limitu.

Moim celem jest użycie tego z opcją warstwowego próbkowania, aby pobrać wystarczająco dużą próbkę ze stosunkowo rzadkiej klasy.

kohoz
źródło
Nie jestem pewien, jaki jest prawdziwy powód, ale próbka bootstrap ma zwykle taki sam rozmiar jak oryginalna próbka, więc to zachowanie wydaje się idealnie zgodne z tym, czego oczekiwałbym od czegoś, co twierdzi, że pobiera próbki bootstrap.
joran,
1
Cóż, to był mój wybór, nie dokumentacja, ale twój punkt widzenia jest dobrze przemyślany. Mimo to jest to niewygodne przy próbie ponownego zrównoważenia dystrybucji i nie znam powodu, dla którego jest to pomocne ograniczenie do nałożenia.
cohoz 12.12.12

Odpowiedzi:

5

To nie wyjaśnia dlaczego , ale aby obejść ten problem, można zduplikować dane dla rzadkiej klasy w danych treningowych i pobrać warstwową próbkę wyniku.

Dwie wady tego podejścia w porównaniu z „naturalnym” nadpróbkowaniem:

  • szacunki braku bagażu nie mają już znaczenia
  • potrzeba więcej zasobów do przechowywania obiektu i pobierania losowych próbek

ale pozwoli zbudować las z pożądanymi proporcjami klas.

kohoz
źródło
4

Mam dokładnie to samo pytanie i znalazłem to w dzienniku zmian dla randomForest :

Zmiany w 4.1-0:

  • W randomForest (), jeśli podano sampsize, próbkowanie jest teraz wykonywane bez zamiany, oprócz stratyfikacji według klasy. Dlatego sampsize nie może być większy niż częstotliwości klasy.

Ręczne ustawienie replace = TRUE również nie zastępuje tego.

hgcrpd
źródło
2
Może się zdarzyć, że parametr replace zostanie po prostu zignorowany, ale później w tym dzienniku zmian: Zmiany w 4.5-12: * Dodano argument „strat” do randomForest, który w połączeniu z „sampsize” pozwala na próbkowanie (z lub bez zamiany) zgodnie ze zmienną warstwową (która może być czymś innym niż zmienna klasy). Obecnie działa tylko w klasyfikacji.
cohoz
Na przykład ten sam błąd jest generowany przezrf <- randomForest(Species ~ ., iris, sampsize=c(51, 1, 1), strata=iris$Species, replace=TRUE)
cohoz
Co więcej, niektóre przypadki testowe z bieżącą wersją (4.6-7) wskazują, że próbki pobierane są zamiennie, więc to nie jest wyjaśnienie.
cohoz
1
Skończyło się na nadpróbkowaniu przed uruchomieniem randomForest. Prawdopodobnie coś jest nie tak z tą metodologią, ale wydaje się, że działa, kiedy testuję wyniki.
hgcrpd
1
Nie, to jest obejście, którego używam i robi dokładnie to, czego się chce. Zwłaszcza w przypadku użycia jednej stosunkowo rzadkiej klasy powielanie danych dla tej klasy w zestawie szkoleniowym, a przed pobraniem warstwowej próbki działa dobrze, a „koszt” dodatkowej pamięci / procesora nie jest zbyt wysoki. Myślę, że warto napisać „odpowiedź”, nawet jeśli tak naprawdę nie jest jedna…
cohoz