J'ai reçu un script R de quelqu'un pour exécuter un modèle de forêt aléatoire. Je l'ai modifié et l'ai exécuté avec certaines données d'employé. Nous essayons de prédire les séparations volontaires.
Voici quelques informations supplémentaires: ceci est un modèle de classification où 0 = employé bloqué, 1 = employé licencié, nous examinons actuellement une dizaine de variables prédictives, les données sont "non équilibrées" en ce sens que les enregistrements terminés représentent environ 7 % du total des enregistrements.
Je lance le modèle avec différentes sélections de fichiers et de fichiers, mais je m'installe au-dessous. Le taux de rendement opérationnel est de 6,8%, ce qui est, à mon avis, bon, mais la matrice de confusion semble raconter une histoire différente pour prédire les termes puisque le taux d'erreur est assez élevé, à 92,79% . le taux d'erreur élevé pour prédire les termes? ou puis-je faire quelque chose pour utiliser RF et obtenir un taux d'erreur plus faible pour prédire les termes?
FOREST_model <- randomForest(theFormula, data=trainset, mtry=3, ntree=500, importance=TRUE, do.trace=100)
ntree OOB 1 2
100: 6.97% 0.47% 92.79%
200: 6.87% 0.36% 92.79%
300: 6.82% 0.33% 92.55%
400: 6.80% 0.29% 92.79%
500: 6.80% 0.29% 92.79%
> print(FOREST_model)
Call:
randomForest(formula = theFormula, data = trainset, mtry = 3, ntree = 500, importance = TRUE, do.trace = 100)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 3
OOB estimate of error rate: 6.8%
Confusion matrix:
0 1 class.error
0 5476 16 0.002913328
1 386 30 0.927884615
> nrow(trainset)
[1] 5908
la source
Votre jeu est nettement déséquilibré - RF échoue généralement dans ce scénario (c'est-à-dire qu'il ne prédit bien que la classe la plus grande).
Vous devriez essayer d’équilibrer votre ensemble en échantillonnant la classe "0" uniquement pour avoir à peu près la même taille que la classe "1" ou en jouant avec le
classwt
paramètre.la source
classwt
paramètre, je ne pense pas qu'il soit encore implémenté dans larandomForest()
fonction durandomForest
package dans R. Per Link . L'avez-vous déjà utilisé? Je l'ai essayé avec des valeurs différentes, mais j'ai obtenu des résultats identiques à ceux par défautclasswt=NULL
.Sur la base de votre matrice de confusion, vous avez 5 908 points de données et la grande majorité d'entre eux sont de type 0 ("employé est resté"). Le classificateur peut donc se permettre d'être "paresseux" et de choisir la classe majoritaire à moins d'être absolument certain qu'un exemple appartient à l'autre classe. Notez que votre taux d'erreur global est d'environ 7%, ce qui est assez proche du pourcentage d'exemples de Class1!
Vous avez quelques options:
Supprimez les exemples de Classe0 jusqu'à ce que vous ayez des classes équilibrées. Je ne sais pas s'il existe de la littérature sur la manière de choisir un sous-ensemble parfaitement représentatif (peut-être que quelqu'un d'autre peut intervenir?), Mais vous pouvez commencer par laisser tomber des exemples au hasard. Vous pouvez passer un
subset
argument à randomForest, ce qui devrait rendre cela trivial à tester.Ajustez les poids de votre fonction / classe de perte pour compenser le nombre disproportionné de Class0. Vous voulez essentiellement rendre beaucoup plus coûteux pour le classificateur de classer de manière erronée un exemple Class1 par rapport à un exemple Class0. Il peut être judicieux d’essayer Class0 = 1 / 0,07 ~ = 14x Class1 pour commencer, mais vous pouvez ajuster ce paramètre en fonction des demandes de votre entreprise (l’importance d’un type d’erreur). Je pense que le
classwt
paramètre est ce que vous recherchez ici.Utilisez un échantillonnage stratifié pour vous assurer que vous avez des exemples des deux classes dans les données de formation des arbres. Il est possible que certaines de vos arborescences n'aient été formées que sur des données Class0, ce qui est évidemment de piètre augure pour leurs performances en matière de généralisation. Découvrez l'
strata
argument.la source