comment utiliser classwt dans randomForest of R?

j'ai un très déséquilibrée de l'ensemble de données avec la cible des instances de classe dans le rapport suivant (edit:)60000:1000:1000:100060000:1000:1000:50(soit un total de 4 classes). Je veux utiliser randomForest pour faire des prédictions, de la classe cible.

donc, pour réduire le déséquilibre de classe, j'ai joué avec sampsize paramètre, le paramètre (edit:)c(5000, 1000, 1000, 1000)c(5000, 1000, 1000, 50) et quelques autres valeurs, mais il n'y avait pas beaucoup d'utilisation. Réellement, la précision de la 1ère classe a diminué pendant que je jouais avec , bien que l'amélioration des autres prédictions de classe ait été très minime.

en fouillant dans les archives, je suis tombé sur deux autres caractéristiques de randomForest() qui sont strata et classwt qui sont utilisés pour compenser la classe question du déséquilibre.

Tous les documents sur classwt étaient vieux (appartenant généralement aux années 2007, 2008), que tous ont suggéré de ne pas utiliser le classwt caractéristique randomForest paquet R comme il n'implémente pas complètement ses fonctionnalités complètes comme il le fait dans fortran. Donc, la première question est la suivante:

classwt complètement mis en œuvre maintenant dans randomForest paquet de R? Si oui, ce ne en passant c(1, 10, 10, 10)classwt argument représenter? (en supposant le cas ci-dessus de 4 classes dans la variable cible)

un autre argument qui est dit pour compenser la question du déséquilibre de classe est l'échantillonnage stratifié, qui est toujours utilisé dans conjointement avec sampsize. Je comprends ce que sampsize provient de la documentation, mais il n'y a pas assez de documentation ou d'exemples qui donnent un aperçu clair de l'utilisation de strata pour surmonter la question du déséquilibre de classe. Ainsi, la deuxième question est la suivante:

quel type d'arguments doit être passé à stratarandomForest et ce que représente t-il?

je suppose que le mot poids que je n'ai pas mentionné explicitement dans la la question devrait jouer un rôle majeur dans la réponse.

23
demandé sur Avinash Raj 2013-11-27 23:53:38

2 réponses

classwt est correctement répercutée sur randomForest, cochez cette exemple:

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

les poids de classe sont les prieurs sur les résultats. Vous devez les équilibrer pour atteindre les résultats que vous voulez.


strata et sampsize cette réponse pourrait être de l'aide: https://stackoverflow.com/a/20151341/2874779

En général, sampsize avec la même taille pour toutes les classes semble raisonnable. strata est un facteur qui va être utilisé pour rééchantillonnage stratifié, dans votre cas, vous n'avez pas besoin d'entrer quoi que ce soit.

3
répondu catastrophic-failure 2017-05-23 12:25:22

les forêts aléatoires ne sont probablement pas le bon classificateur pour votre problème car ils sont extrêmement sensibles au déséquilibre de classe.

quand j'ai un problème de déséquilibre, je le règle en utilisant sampsize comme vous avez essayé. Cependant, je fais toutes les strates de taille égale et j'utilise un échantillonnage sans remplacement. L'échantillonnage sans remplacement est important ici, car autrement les échantillons des classes plus petites contiendront beaucoup plus de répétitions, et la classe sera encore sous-représentée. Il peut être nécessaire d'augmenter mtry si cette approche conduit à de petits échantillons, parfois même le réglage au nombre total de fonctionnalités.

cela fonctionne bien calme quand il y a assez d'articles dans la plus petite classe. Cependant, votre plus petite classe n'a que 50 articles. Je doute que vous obteniez des résultats utiles sampsize=c(50,50,50,50).

classwt n'a jamais fonctionné pour moi.

1
répondu Daniel Mahler 2016-02-04 05:22:27