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é à strata
randomForest
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.
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.
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.