Implementazioni ottimizzate dell'algoritmo Random Forest


43

Ho notato che ci sono alcune implementazioni di foreste casuali come ALGLIB, Waffles e alcuni pacchetti R come randomForest. Qualcuno può dirmi se queste librerie sono altamente ottimizzate? Sono sostanzialmente equivalenti alle foreste casuali descritte in dettaglio in The Elements of Statistical Learning o sono stati aggiunti molti trucchi extra?

Spero che questa domanda sia abbastanza specifica. Come illustrazione del tipo di risposta che sto cercando, se qualcuno mi chiedesse se il pacchetto di algebra lineare BLAS fosse altamente ottimizzato, direi che era estremamente ottimizzato e per lo più non vale la pena cercare di migliorare se non in applicazioni molto specializzate.


Jungle casuale può essere eseguito su molti server in modo parallelo. Vedi: Schwarz, et al (2010). Da Safari a Random Jungle: una rapida implementazione di Random Forests per dati ad alta dimensione. Bioinformatica, 26 , 14, pp 1752–8, doi.org/10.1093/bioinformatics/btq257 . codice: 1 ; 2 ; 3 ; 4 .
Utente 128525

Risposte:


31

(Aggiornato il 6 IX 2015 con suggerimenti dai commenti, anche in CW)

Ci sono due nuovi, simpatici pacchetti disponibili per R che sono abbastanza ben ottimizzati per determinate condizioni:

  • Ranger - C ++, pacchetto R, ottimizzato per problemi, parallele, trattamento speciale di dati GWAS.p>>n
  • Arborist - C ++, Python e R attacchi, ottimizzati per RILEVANTI problemi, a quanto pare i piani per GPGPU.n

Altre implementazioni RF:

  • The Original One : codice Fortran autonomo, non parallelo, piuttosto difficile da usare.
  • randomForest - pacchetto C, R, probabilmente il più popolare, non parallelo, in realtà abbastanza veloce rispetto a una velocità single-core, specialmente per i piccoli dati.
  • randomForestSRC - Pacchetto C, R, clone di randomForest che supporta l'elaborazione parallela e problemi di sopravvivenza.
  • party - pacchetto C, R, abbastanza lento, ma progettato come un piano per sperimentare la RF.
  • bigrf - pacchetto C + / R, R, creato per funzionare sui big data all'interno del framework bigmemory ; abbastanza lontano dall'essere completo.
  • scikit learn Ensemble forest - Python, parte del framework scikit-learn, parallelo, implementa molte varianti di RF.
  • milk 's RF - Python, parte del framework del latte.
  • Waffles - C ++, parte di un kit di strumenti ML più grande, parallelo e abbastanza veloce.
  • cosiddetto WEKA rf - Java / WEKA, parallelo.
  • ALGLIB
  • Jungle casuale - abbandonata?
  • rt-rank - abbandonato?
  • PARF - abbandonato?

La carta Ranger presenta alcuni confronti di velocità / memoria, ma non esiste un benchmark accurato.


6
È ora possibile aggiungere sklearn.ensemble dalla casella degli strumenti di Python scikit-learn.
chl

1
Milk in Python ha anche un'implementazione di Random Forest.
JEquihua,

3
Random Jungle è stato sostituito da Ranger. Ho provato la versione R (c'è un'altra versione C ++) ed è notevolmente più veloce di randomForest (non ci ho pensato però). L'autore ha effettuato alcuni test in un documento separato ( arxiv.org/abs/1508.04409 ).
NoviceProg

11

Per quanto ne so, la versione R di randomForest chiama lo stesso codice Fortran della versione originale. Inoltre, è banale parallelizzare la funzione randomForest. In realtà è uno degli esempi forniti nella documentazione di foreach .

library(foreach)
library(randomForest)
rf <- foreach(ntree = rep(250, 4), .combine = combine, .packages = "randomForest") %dopar% 
randomForest(x, y, ntree = ntree)

Dato che le foreste casuali sono imbarazzantemente parallele, la più grande ottimizzazione che puoi fare è eseguirle in parallelo. Dopodiché, non credo ci siano altri frutti a basso potenziale nell'algoritmo, ma potrei sbagliarmi.

L'unico problema è che si perde la stima dell'errore out-of-bag nella foresta combinata, ma probabilmente c'è un modo semplice per calcolarlo (mi piacerebbe davvero scoprire come farlo).


7

L' ELSII usava randomForest (vedi ad esempio nota 3 p.591), che è un'implementazione R del codice Breiman e Cutler's Fortran di Salford. Il codice di Andy Liaw è in C.

C'è un'altra implementazione di RF proposta nel pacchetto party (in C), che si basa su R / Lapack, che ha alcune dipendenze da BLAS (vedi /include/R_ext/Lapack.hnella tua directory R di base).

Per quanto riguarda il bagging, non dovrebbe essere troppo difficile parallelizzarlo, ma permetterò agli utenti più specializzati di rispondere su questo aspetto.


5

Il team dietro randomJungle afferma che è un ordine di grandezza più veloce dell'implementazione di R randomForest e usa un ordine di grandezza in meno di memoria. Un pacchetto per randomJungle è in fase di sviluppo per R ma non riesco ancora a costruire.

https://r-forge.r-project.org/projects/rjungler/


Non sono sicuro che questo ti interessi ancora dopo 4 anni, ma gli autori di randomJungle lo hanno sostituito con Ranger. Ho provato la versione R ed è davvero notevolmente più veloce di randomForest con alcuni dati di esempio (non ho tempo però).
NoviceProg

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.