Campionamento con sostituzione in R randomForest


11

L'implementazione randomForest non consente il campionamento oltre il numero di osservazioni, anche quando si campiona con la sostituzione. Perchè è questo?

Funziona bene:

rf <- randomForest(Species ~ ., iris, sampsize=c(1, 1, 1), replace=TRUE)
rf <- randomForest(Species ~ ., iris, sampsize=3, replace=TRUE)

Cosa voglio fare:

rf <- randomForest(Species ~ ., iris, sampsize=c(51, 1, 1), replace=TRUE)
Error in randomForest.default(m, y, ...) : 
  sampsize can not be larger than class frequency

Errore simile senza campione stratificato:

rf <- randomForest(Species ~ ., iris, sampsize=151, replace=TRUE)
Error in randomForest.default(m, y, ...) : sampsize too large

Dato che mi aspettavo che il metodo prendesse campioni bootstrap quando veniva dato sostituire = TRUE in entrambi i casi, non mi aspettavo questo limite.

Il mio obiettivo è quello di utilizzare questo con l'opzione di campionamento stratificato, al fine di prelevare un campione sufficientemente grande da una classe relativamente rara.


Non sono sicuro di quale sia la vera ragione, ma un campione bootstrap ha in genere le stesse dimensioni del campione originale, quindi questo comportamento sembra perfettamente in linea con quello che mi aspetterei da qualcosa che pretende di prendere campioni bootstrap.
joran,

1
Bene, questa è stata la mia scelta della parola non della documentazione, ma il tuo punto è ben preso. Tuttavia, questo è scomodo quando si tenta di riequilibrare la distribuzione e non conosco un motivo per cui questa è una restrizione utile da imporre.
cohoz,

Risposte:


5

Questo non risponde al perché , ma per ovviare a questo, si possono duplicare i dati per la rara classe nei dati di allenamento e prendere un campione stratificato del risultato.

Due svantaggi di questo approccio, rispetto a un sovracampionamento "naturale":

  • le stime out of bag non sono più significative
  • sono necessarie più risorse per memorizzare l'oggetto e prelevare campioni casuali

ma consentirà di costruire la foresta con i rapporti di classe desiderati.


4

Ho la stessa identica domanda e l'ho trovata nel registro delle modifiche per randomForest :

Cambiamenti in 4.1-0:

  • In randomForest (), se viene fornito sampsize, il campionamento viene ora eseguito senza sostituzione, oltre a stratificato per classe. Pertanto il sampsize non può essere maggiore delle frequenze della classe.

Anche l'impostazione di sostituire = TRUE manualmente non sembra sostituirla.


2
È possibile che il parametro di sostituzione venga semplicemente ignorato, ma più avanti in quel log delle modifiche: modifiche in 4.5-12: * Aggiunto l'argomento 'strati' a randomForest, che, insieme a 'sampsize', consente il campionamento (con o senza sostituzione) secondo una variabile di strati (che può essere qualcosa di diverso dalla variabile di classe). Attualmente funziona solo in classificazione.
cohoz,

Ad esempio, lo stesso errore viene generato tramiterf <- randomForest(Species ~ ., iris, sampsize=c(51, 1, 1), strata=iris$Species, replace=TRUE)
cohoz il

Inoltre, alcuni casi di test con la versione corrente (4.6-7) indicano che i campioni vengono prelevati con la sostituzione, quindi questa non è la spiegazione.
cohoz,

1
Ho finito col sovracampionare prima di eseguire randomForest. Probabilmente c'è qualcosa di sbagliato in questa metodologia, ma sembra che funzioni quando collaudo i risultati.
hgcrpd,

1
No, questa è la soluzione alternativa che uso e fa esattamente quello che uno vuole. Soprattutto per il caso d'uso di una classe relativamente rara, duplicare i dati per quella classe sul set di addestramento e prima di prelevare un campione stratificato funziona bene e il "costo" in termini di memoria aggiuntiva / CPU non è troppo elevato. Immagino valga la pena scrivere una "risposta" anche se in realtà non è una ...
cohoz,
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.