Échantillonnage avec remplacement dans R randomForest

11

L'implémentation randomForest ne permet pas l'échantillonnage au-delà du nombre d'observations, même lors d'un échantillonnage avec remplacement. Pourquoi est-ce?

Fonctionne bien:

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

Ce que je veux faire:

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

Erreur similaire sans échantillon stratifié:

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

Étant donné que je m'attendais à ce que la méthode prenne des échantillons de bootstrap lorsque replace = TRUE est donné dans les deux cas, je ne m'attendais pas à cette limite.

Mon objectif est de l'utiliser avec l'option d'échantillonnage stratifié, afin de prélever un échantillon suffisamment important dans une classe relativement rare.

cohoz
la source
Je ne suis pas sûr de la vraie raison, mais un échantillon de bootstrap est généralement de la même taille que votre échantillon d'origine, donc ce comportement semble parfaitement conforme à ce que j'attendrais de quelque chose prétendant prendre des échantillons de bootstrap.
joran
1
Eh bien, c'était mon choix de mot, pas celui de la documentation, mais votre point est bien compris. Pourtant, cela n'est pas pratique lorsque vous essayez de rééquilibrer la distribution et je ne sais pas pourquoi il s'agit d'une restriction utile à imposer.
cohoz

Réponses:

5

Cela ne répond pas pourquoi , mais pour contourner ce problème, on peut dupliquer les données de la classe rare dans les données de formation et prendre un échantillon stratifié du résultat.

Deux inconvénients à cette approche, par rapport à un suréchantillonnage "naturel":

  • les estimations hors du sac n'ont plus de sens
  • plus de ressources sont nécessaires pour stocker l'objet et prélever des échantillons aléatoires

mais cela permettra de construire la forêt avec les ratios de classe désirés.

cohoz
la source
4

J'ai exactement la même question et je l'ai trouvée dans le changelog de randomForest :

Changements dans 4.1-0:

  • Dans randomForest (), si sampsize est donné, l'échantillonnage est maintenant effectué sans remplacement, en plus d'être stratifié par classe. Par conséquent, sampsize ne peut pas être plus grand que les fréquences de classe.

La définition manuelle de replace = TRUE ne semble pas non plus l'emporter.

hgcrpd
la source
2
Il se peut que le paramètre replace soit simplement ignoré, mais plus tard dans ce journal des modifications: Changements dans 4.5-12: * Ajout de l'argument 'strata' à randomForest, qui, en conjonction avec 'sampsize', permet l'échantillonnage (avec ou sans remplacement) selon une variable de strate (qui peut être autre chose que la variable de classe). Actuellement ne fonctionne que dans la classification.
cohoz
Par exemple, la même erreur est générée viarf <- randomForest(Species ~ ., iris, sampsize=c(51, 1, 1), strata=iris$Species, replace=TRUE)
cohoz
De plus, certains cas de test avec la version actuelle (4.6-7) indiquent que des échantillons sont prélevés avec remplacement, ce n'est donc pas l'explication.
cohoz
1
J'ai fini par suréchantillonner juste avant d'exécuter randomForest. Il y a probablement quelque chose qui ne va pas avec cette méthodologie, mais elle semble fonctionner lorsque je teste les résultats.
hgcrpd
1
Non, c'est la solution de contournement que j'utilise et elle fait exactement ce que l'on veut. Surtout pour le cas d'utilisation d'une classe relativement rare, la duplication des données de cette classe sur l'ensemble d'apprentissage et avant de prendre un échantillon stratifié fonctionne bien et le "coût" en termes de mémoire / CPU supplémentaire n'est pas trop élevé. Je suppose que cela vaut la peine d'écrire une "réponse" même si ce n'est vraiment pas une ...
cohoz