Suggerimenti per velocizzare le foreste casuali

Sto facendo un po ‘di lavoro con il pacchetto randomForest e mentre funziona bene, può richiedere molto tempo. Qualcuno ha qualche suggerimento per accelerare le cose? Sto usando una scatola di Windows 7 con un chip AMD dual core. So che R non è multi-thread / processore, ma ero curioso di sapere se uno qualsiasi dei pacchetti paralleli ( rmpi , snow , snowfall , ecc.) randomForest per cose randomForest . Grazie.

MODIFICARE:

Sto usando rF per alcuni lavori di classificazione (0 e 1). I dati hanno circa 8-12 colonne variabili e il set di allenamento è un campione di 10k linee, quindi è di dimensioni decenti ma non pazzo. Sto correndo 500 alberi e una mazza di 2, 3 o 4.

EDIT 2: Ecco alcuni output:

 > head(t22) Id Fail CCUse Age S-TFail DR MonInc #OpenLines L-TFail RE M-TFail Dep 1 1 1 0.7661266 45 2 0.80298213 9120 13 0 6 0 2 2 2 0 0.9571510 40 0 0.12187620 2600 4 0 0 0 1 3 3 0 0.6581801 38 1 0.08511338 3042 2 1 0 0 0 4 4 0 0.2338098 30 0 0.03604968 3300 5 0 0 0 0 5 5 0 0.9072394 49 1 0.02492570 63588 7 0 1 0 0 6 6 0 0.2131787 74 0 0.37560697 3500 3 0 1 0 1 > ptm  > RF proc.time() - ptm user system elapsed 437.30 0.86 450.97 > 

Il manuale del pacchetto foreach ha una sezione sulle foreste parallele casuali ( utilizzando il pacchetto foreach , sezione 5.1):

 > library("foreach") > library("doSNOW") > registerDoSNOW(makeCluster(4, type="SOCK")) > x <- matrix(runif(500), 100) > y <- gl(2, 50) > rf <- foreach(ntree = rep(250, 4), .combine = combine, .packages = "randomForest") %dopar% + randomForest(x, y, ntree = ntree) > rf Call: randomForest(x = x, y = y, ntree = ntree) Type of random forest: classification Number of trees: 1000 

Se vogliamo creare un modello di foresta casuale con 1000 alberi e il nostro computer ha quattro core, possiamo dividere il problema in quattro parti eseguendo la funzione randomForest quattro volte, con l’argomento ntree impostato su 250. Naturalmente, dobbiamo combinare gli oggetti randomForest risultanti, ma il pacchetto randomForest viene fornito con una funzione chiamata combine .

Ci sono due opzioni ‘out of the box’ che risolvono questo problema. Innanzitutto, il pacchetto di caret contiene un metodo ‘parRF’ che gestisce questo elegantemente. Io di solito uso questo con 16 core con grande effetto. Il pacchetto randomShrubbery sfrutta anche i vantaggi di più core per RF su Revolution R.

Perché non usi un’implementazione già parallela e ottimizzata di Random Forest? Dai un’occhiata a SPRINT usando MPI. http://www.r-sprint.org/

C’è qualche ragione particolare per cui non stai usando Python (vale a dire i moduli scikit-learn e multiprocessing) per implementarlo? Usando joblib, ho addestrato foreste casuali su set di dati di dimensioni simili in una frazione del tempo impiegato in R. Anche senza multiprocessing, le foreste casuali sono significativamente più veloci in Python. Ecco un rapido esempio di formazione di un classificatore RF e cross convalidare in Python. Puoi anche estrarre facilmente le importazioni delle funzionalità e visualizzare gli alberi.

 import numpy as np from sklearn.metrics import * from sklearn.cross_validation import StratifiedKFold from sklearn.ensemble import RandomForestClassifier #assuming that you have read in data with headers #first column corresponds to response variable y = data[1:, 0].astype(np.float) X = data[1:, 1:].astype(np.float) cm = np.array([[0, 0], [0, 0]]) precision = np.array([]) accuracy = np.array([]) sensitivity = np.array([]) f1 = np.array([]) matthews = np.array([]) rf = RandomForestClassifier(n_estimators=100, max_features = 5, n_jobs = 2) #divide dataset into 5 "folds", where classs are equally balanced in each fold cv = StratifiedKFold(y, n_folds = 5) for i, (train, test) in enumerate(cv): classs = rf.fit(X[train], y[train]).predict(X[test]) precision = np.append(precision, (precision_score(y[test], classs))) accuracy = np.append(accuracy, (accuracy_score(y[test], classs))) sensitivity = np.append(sensitivity, (recall_score(y[test], classs))) f1 = np.append(f1, (f1_score(y[test], classs))) matthews = np.append(matthews, (matthews_corrcoef(y[test], classs))) cm = np.add(cm, (confusion_matrix(y[test], classs))) print("Accuracy: %0.2f (+/- %0.2f)" % (accuracy.mean(), accuracy.std() * 2)) print("Precision: %0.2f (+/- %0.2f)" % (precision.mean(), precision.std() * 2)) print("Sensitivity: %0.2f (+/- %0.2f)" % (sensitivity.mean(), sensitivity.std() * 2)) print("F1: %0.2f (+/- %0.2f)" % (f1.mean(), f1.std() * 2)) print("Matthews: %0.2f (+/- %0.2f)" % (matthews.mean(), matthews.std() * 2)) print(cm)