2015-10-02 11 views
5

Ho un set di dati composto da 20 funzioni e circa 300.000 osservazioni. Sto usando il caret per addestrare il modello con doParallel e quattro core. Anche la formazione sul 10% dei miei dati richiede ben più di otto ore per i metodi che ho provato (rf, nnet, adabag, svmPoly). Sto ricampionando con bootstrap 3 volte e il mio tuneLength è 5. C'è qualcosa che posso fare per accelerare questo processo agonizzante lento? Qualcuno ha suggerito di usare la libreria sottostante per velocizzare il mio processo fino a 10 volte, ma prima di intraprendere questa strada mi piacerebbe assicurarmi che non ci siano altre alternative.Miglioramento della velocità di addestramento del modello nel punto di inserimento (R)

+0

Per chiedere l'ovvio: sarebbe possibile lavorare con un sottoinsieme delle osservazioni 300K? Si potrebbe dimostrare che un sottoinsieme di 30K si comporta allo stesso modo come il set completo da 300 K. –

+0

Ciao Tim, scusate se non ero chiaro, 8 ore erano per l'allenamento di 30k osservazioni (10%). L'allenamento dell'1% richiede un tempo ragionevole, ma non è molto predittivo. domanda per te: il mio risultato è un fattore binario ("Sì"/"No") ma "Sì" si verifica solo in circa il 20% del mio set di dati totale. Pensi che fornire un set di prova con una divisione più omogenea (ad esempio 50/50 'Sì'/'No') potrebbe permettermi di allenarmi su un campione più piccolo? –

+0

È davvero così lento su 30k x 20? Questo è davvero sorprendente. Quanta RAM stai lavorando? – devmacrile

risposta

9

phiver colpisce il chiodo sulla testa, ma, per questa situazione, ci sono alcune cose da suggerire:

  • fare in modo che non si è estenuante memoria di sistema utilizzando l'elaborazione parallela. Stai facendo X copie extra dei dati in memoria quando si utilizza X lavoratori.
  • con uno squilibrio di classe, additional sampling può aiutare. Il downsampling potrebbe aiutare a migliorare le prestazioni e impiegare meno tempo.
  • utilizza librerie diverse. ranger anziché randomForest, xgboost o C5.0 anziché gbm. Dovresti capire che i metodi d'insieme si adattano a una tonnellata di modelli costitutivi e sono obbligati a prendersi un po 'di tempo per adattarsi.
  • il pacchetto ha un racing-type algorithm per i parametri di regolazione in minor tempo
  • la versione di sviluppo su github ha metodi di ricerca casuali per i modelli con molti parametri di ottimizzazione.

Max

9

Ciò che le persone dimenticano quando si confronta il modello sottostante con l'uso del caret è che il caret ha un sacco di cose extra in corso.

Prendi ad esempio la tua foresta casuale. quindi bootstrap, numero 3 e tuneLength 5. Così ricampionate 3 volte e, a causa della tuneLength, provate a trovare un buon valore per mtry. In totale, esegui 15 foreste casuali e confrontale per ottenere il migliore per il modello finale, rispetto a solo 1 se utilizzi il modello di foresta casuale di base.

Inoltre, si sta eseguendo il parallelismo su 4 core e randomforest richiede tutte le osservazioni disponibili, quindi tutte le osservazioni di allenamento saranno 4 volte in memoria. Probabilmente non è rimasto molto spazio per la formazione del modello.

Il mio consiglio è di iniziare il ridimensionamento per vedere se è possibile velocizzare le cose, come impostare il numero di bootstrap su 1 e sintonizzare la lunghezza sul valore predefinito 3. O anche impostare il metodo di traincontrollo su "none", solo per ottenere un'idea su quanto è veloce il modello sulle impostazioni minime e nessun ricampionamento.

+0

Quali accorgimenti "extra" sono in corso rispetto agli altri metodi? – user1603472

1

Grandi ingressi di @phiver e @topepo. Cercherò di riassumere e aggiungere alcuni punti che ho raccolto da quel po 'di messaggi SO ricerca che ho fatto per un problema simile:

  • Sì, l'elaborazione parallela richiede più tempo, con la memoria minore. Con 8 core e 64 GB di RAM, una regola empirica potrebbe essere quella di utilizzare al massimo 5-6 dipendenti.
  • La pagina di @ topepo sulla preelaborazione del caret here è fantastica. È istruttivo a livello di passo e aiuta a sostituire il lavoro manuale di pre-elaborazione come le variabili dummy, rimuovendo le variabili di combinazione multi-collineare/lineari e la trasformazione.
  • Uno dei motivi per cui i modelli randomForest e altri diventano molto lenti è a causa del numero di fattori nelle variabili categoriali. Si consiglia o di club i fattori o convertire in trasformazione ordinale/numerica, se possibile.
  • Provate a utilizzare la funzione Tunegrid nel caret al massimo per i modelli di ensemble. Inizia con meno valori di mtry/ntree per un campione di dati e vedi come funziona in termini di miglioramento nel miglioramento della precisione.
  • Ho scoperto che la pagina SO this è molto utile in caso di suggerimento di parRF. Non ho migliorato molto il mio set di dati sostituendo RF con parRF ma puoi provare. Gli altri suggerimenti sono di usare data.table invece di dataframes e usare dati di predittore/risposta invece di formula. Migliora notevolmente la velocità, credetemi (ma c'è un avvertimento, la prestazione dei dati di predittore/risposta (fornendo x = X, y = Y data.tables) sembra anche in qualche modo migliorare l'accuratezza predittiva in qualche modo e cambiare la tabella di importanza variabile da break-up dei fattori durante l'uso della formula (Y ~.)
Problemi correlati