Losowy czas obliczania lasu w R.

49

Korzystam z pakietu imprezowego w R z 10 000 wierszy i 34 funkcjami, a niektóre funkcje czynnikowe mają ponad 300 poziomów. Czas przetwarzania jest za długi. (Jak dotąd zajęło to 3 godziny i jeszcze się nie skończyło.)

Chcę wiedzieć, które elementy mają duży wpływ na czas obliczeń losowego lasu. Czy ma to zbyt wiele czynników? Czy są jakieś zoptymalizowane metody poprawy czasu obliczeń RF?

Chenghao Liu
źródło

Odpowiedzi:

65

Ogólna złożoność RF to coś w rodzaju ; jeśli chcesz przyspieszyć swoje obliczenia, możesz spróbować:ntreemtry(# objects)log(# objects)

  1. Użyj randomForestzamiast party, lub nawet lepiej, rangerlub Rborist(chociaż oba nie są jeszcze przetestowane w walce).
  2. Nie używaj formuły, tzn. Zadzwoń randomForest(predictors,decision)zamiast randomForest(decision~.,data=input).
  3. Użyj do.traceargumentu, aby zobaczyć błąd OOB w czasie rzeczywistym; w ten sposób możesz wykryć, że możesz obniżyć ntree.
  4. O czynnikach; RF (i wszystkie metody drzewa) próbują znaleźć optymalny podzbiór poziomów, skanując w ten sposób możliwości; w tym celu jest dość naiwny, ten czynnik może dać ci tyle informacji - nie wspominając o tym, że randomForest nie zje czynników z więcej niż 32 poziomami. Może możesz po prostu potraktować go jako uporządkowany (a tym samym równoważny normalnej zmiennej numerycznej dla RF) lub podzielić go na kilka grup, dzieląc ten jeden atrybut na kilka?2(# of levels-1)
  5. Sprawdź, czy na komputerze nie zabrakło pamięci RAM i czy używa miejsca wymiany. Jeśli tak, kup większy komputer.
  6. Na koniec możesz wyodrębnić losowy podzbiór obiektów i przeprowadzić na nim wstępne eksperymenty.
Przywróć Monikę
źródło
2
Dziękuję, dużo się uczę z twojej odpowiedzi i wykonałem test, jak powiedziałeś, poza tym, dlaczego druga sugestia działa?
Chenghao Liu
4
Formuły @ChenghaoLiu zostały zaprojektowane dla małych, ale złożonych ramek modeli liniowych, a zatem są nieefektywne, gdy kopiowanie zestawu staje się drogie.
1
Dlaczego wywołanie randomForest (predyktory, decyzja) skraca czas działania?
JenSCDC
Co to jest ? mtry
jkabrg
1
@AndyBlankertz Interpretacja formuł w randomForest wydaje się prowadzić do kopiowania całego wejścia.
12

Ponieważ randomForest jest zbiorem niezależnych wózków szkolonych na losowym podzbiorze funkcji i zapisów, nadaje się do równoległości. combine()Funkcja w lasy losowe pakietu będzie połączyć ze sobą niezależnie wyszkolonych lasy. Oto przykład zabawki. Jak stwierdza odpowiedź @mpq, nie należy używać zapisu formuły, ale przekazać ramkę danych / macierz zmiennych i wektor wyników. Bezwstydnie zdjąłem je z dokumentów.

library("doMC")
library("randomForest")
data(iris)

registerDoMC(4) #number of cores on the machine
darkAndScaryForest <- foreach(y=seq(10), .combine=combine ) %dopar% {
   set.seed(y) # not really needed
   rf <- randomForest(Species ~ ., iris, ntree=50, norm.votes=FALSE)
}

Przekazałem funkcję łączenia randomForest do podobnie nazwanego parametru .combine (który steruje funkcją na wyjściu pętli. Wadą jest brak wskaźnika błędów OOB lub bardziej tragicznie zmienne znaczenie.

Edytować:

Po ponownym przeczytaniu postu zdaję sobie sprawę, że nie mówię nic o kwestii czynnika 34+. Całkowicie nie przemyślaną odpowiedzią może być przedstawienie ich jako zmiennych binarnych. To jest każdy czynnik kolumna, która jest zakodowana na poziomie 0/1 współczynnik na temat jego obecności / braku obecności. Dokonując selekcji zmiennych dotyczących nieistotnych czynników i usuwając je, możesz zatrzymać zbyt dużą przestrzeń dla funkcji.

Jdennison
źródło
Witamy na stronie @jdennison. Wygląda to na naprawdę fajny wkład (chociaż tak naprawdę nie wiem zbyt wiele o RF i nic o komputerach równoległych). Jedna uwaga: kolejność odpowiedzi może zmieniać się w czasie, dlatego lepiej nie odwoływać się do „powyższej odpowiedzi”, a raczej do „odpowiedzi przez \ @ so-and-so”.
Gung - Przywróć Monikę
Przepraszam za odpowiedź, spóźniłem się. Przeczytałem twój blog, świetna robota
Chenghao Liu,
3

Sugerowałbym kilka linków:

1) Zmniejszenie liczby poziomów zmiennej czynnikowej jest linkiem do pytania, stackoverflowktóre dotyczy podobnego problemu podczas korzystania z randomForestpakietu. W szczególności dotyczy to używania tylko najczęściej występujących poziomów i przypisywania nowego poziomu do wszystkich innych, rzadziej występujących poziomów.

Pomysł zrodził się stąd: Powolne wyzwanie KDD Cup 2009 . Dane dla tej konkurencji zawierały wiele czynników i wiele poziomów. Omówiono niektóre metody, które wykorzystali do zmniejszenia danych z 50 000 wierszy o 15 000 kolumn do uruchomienia na laptopie z 2 rdzeniami / 2 GB pamięci RAM.

Moją ostatnią propozycją byłoby przyjrzenie się temu problemowi, jak zasugerowano powyżej, równolegle na instancji Amazon EC2 o wysokiej wydajności.

screechOwl
źródło
Nie ma 2) . Powinieneś podać ważną część strony zamiast polegać wyłącznie na linku.
AL
Uwielbiam to, jak działają te instancje WE. Wow, są mili. Myślę, że zwirtualizowany sprzęt jest lepszy niż rzeczywisty.
EngrStudent - Przywróć Monikę
2

Nie mogę mówić o szybkości określonych algorytmów w języku R, ale powinno być oczywiste, co powoduje długi czas obliczeń. Dla każdego drzewa w każdej gałęzi CART szuka najlepszego podziału binarnego. Tak więc dla każdej z 34 cech najbardziej patrzy na podziały podane przez każdy z poziomów zmiennych. Pomnóż czas wykonywania każdego podziału w drzewie przez liczbę gałęzi w drzewie, a następnie pomnóż go przez liczbę drzew w lesie, a otrzymasz długi czas pracy. Kto wie? Może nawet z szybkim komputerem ukończenie tego może zająć lata?

Myślę, że najlepszym sposobem na przyspieszenie jest zbicie niektórych poziomów razem, tak aby każda zmienna spadła do 3 do 5 poziomów zamiast do 300. Oczywiście zależy to od możliwości zrobienia tego bez utraty ważnej wartości informacje w twoich danych.

Potem może będziesz mógł sprawdzić, czy istnieje jakiś sprytny algorytm, który może przyspieszyć czas wyszukiwania podziału na każdym węźle poszczególnych drzew. może się zdarzyć, że przy danym drzewie wyszukiwanie podzielone jest powtórzeniem wyszukiwania już wykonanego dla poprzedniego drzewa. Więc jeśli możesz zapisać rozwiązania z poprzednich decyzji dotyczących podziału i określić, kiedy powtarzasz, być może ta strategia może trochę zaoszczędzić czas obliczeniowy.

Michael Chernick
źródło
Jeszcze raz dziękuję, całkowicie się z tobą zgadzam. I próbuję zmniejszyć liczbę poziomów za pomocą fałszywej sztucznej metody. Na przykład zastępuję predyktor 600 poziomami 4 predyktorami (jako 600 <5 ^ 4) Po tej transformacji mogę uruchomić algorytm losowego lasu. Jednak wynik RMSE jest dziwny, otworzę dwa inne pytania o to, jak zmniejszyć poziom współczynnika czynnika i jaki jest związek między 10-krotnym CV RMSE a wynikiem testu RMSE?
Chenghao Liu