2013-11-27 8 views
19

Ho un set di dati altamente squilibrato con istanze di classe target nel seguente rapporto (modifica :) 60000: 1000: 1000: 100060000:1000:1000:50 (vale a dire un totale di 4 classi). Voglio utilizzare randomForest per fare previsioni della classe di destinazione.come usare classwt in randomForest of R?

Quindi, per ridurre lo squilibrio di classe, ho giocato con sampsize parametro, impostandolo a (modifica :)c(5000, 1000, 1000, 1000)c(5000, 1000, 1000, 50) e alcuni altri valori, ma non c'era molto uso di esso. In realtà, l'accuratezza della 1a classe è diminuita mentre giocavo con sampsize, anche se il miglioramento nelle previsioni di altre classi era molto minuto.

Scavando negli archivi, mi sono imbattuto in due ulteriori caratteristiche di randomForest(), che sono strata e classwt che vengono utilizzati per compensare lo squilibrio questione di classe.

Tutti i documenti su classwt erano vecchi (in genere appartenenti alle 2007, 2008 anni), che non tutto ha suggerito l'uso della funzione classwt di randomForest pacchetto R in quanto non implementa completamente la sua completa funzionalità come appare nelle fortran . Quindi la prima domanda è:
classwt è ora completamente implementato nel pacchetto randomForest di R? In caso affermativo, cosa rappresenta il passaggio dello c(1, 10, 10, 10) all'argomento classwt? (Supponendo caso sopra di 4 classi nella variabile di destinazione)

altro argomento che si dice a compensare problema di classe squilibrio campionamento stratificato, che viene sempre utilizzato in combinazione con sampsize. Comprendo che cos'è sampsize dalla documentazione, ma non c'è abbastanza documentazione o esempi che hanno fornito una visione chiara dell'uso di strata per superare il problema dello squilibrio di classe. Quindi la seconda domanda è:
Che tipo di argomenti devono essere passati a strata in randomForest e che cosa rappresenta?

Credo che la parola peso che non ho esplicitamente menzionato nella questione dovrebbe svolgere un ruolo importante nella risposta.

+1

Avrei eseguito una foresta solo sulle tre classi minori. Ciò ti darà un'idea di come un modello rf possa eventualmente distinguere quelle tre classi senza la classe dominante. Se la precisione è ancora piuttosto bassa, probabilmente lo squilibrio di classe non è il tuo vero problema, piuttosto quelle tre classi non si distinguono facilmente con le caratteristiche che hai. – joran

+0

Grazie @joran. Scusa per un po 'di confusione, ecco l'effettivo rapporto di istanza della classe che ho anche modificato nella domanda: 60000: 1000: 1000: 50. Pensi che omettere la prima classe in questo caso aiuterà? Perché quando eseguo RF con tutte e 4 le classi ottengo la precisione nel seguente ordine per ogni classe: c (90%, 70%, 70%, meno del 10%). Sono più preoccupato di migliorare l'accuratezza della 4a classe che è inferiore al 10%. E ancora una cosa è, il 'classwt' correttamente implementato in' randomForest' di R di ora? – StrikeR

+4

Per quanto riguarda l'implementazione di 'classwt' - suppongo che non sia implementata, perché http://cran.r-project.org/web/packages/randomForest/NEWS puoi leggere che" * Implementa il nuovo schema di gestione classwt in classifica. " è nella lista dei desideri. – BartekCh

risposta

0

Le foreste casuali non sono probabilmente il giusto classificatore per il tuo problema in quanto sono estremamente sensibili allo squilibrio di classe.

Quando si verifica un problema di sbilanciamento, in genere mi occupo di esso utilizzando sampsize come si è tentato. Tuttavia faccio tutti gli strati di uguale taglia e uso campionamento senza sostituzione. Qui il campionamento senza sostituzione è importante, altrimenti i campioni delle classi più piccole conterranno molte più ripetizioni e la classe sarà comunque sottorappresentata. Potrebbe essere necessario aumentare mtry se questo approccio porta a piccoli campioni, a volte anche impostandolo sul numero totale di funzionalità.

Questo funziona tranquillamente quando ci sono abbastanza elementi nella classe più piccola. Tuttavia, la tua classe più piccola ha solo 50 elementi. Dubito che otterresti risultati utili con sampsize=c(50,50,50,50).

Anche classwt non ha mai funzionato per me.

2

classwt sia correttamente trasmessi al randomForest, controllare questo esempio:

library(randomForest) 
rf = randomForest(Species~., data = iris, classwt = c(1E-5,1E-5,1E5)) 
rf 

#Call: 
# randomForest(formula = Species ~ ., data = iris, classwt = c(1e-05, 1e-05, 1e+05)) 
#    Type of random forest: classification 
#      Number of trees: 500 
#No. of variables tried at each split: 2 
# 
#  OOB estimate of error rate: 66.67% 
#Confusion matrix: 
#   setosa versicolor virginica class.error 
#setosa   0   0  50   1 
#versicolor  0   0  50   1 
#virginica  0   0  50   0 

pesi di classe sono i priori sugli esiti. Devi bilanciarli per ottenere i risultati che desideri.


Su strata e sampsize questa risposta potrebbe essere di aiuto: https://stackoverflow.com/a/20151341/2874779

In generale, sampsize con la stessa dimensione per tutte le classi sembra ragionevole. strata è un fattore che verrà utilizzato per il ricampionamento stratificato, nel tuo caso non è necessario inserire nulla.