Modérateur : Groupe des modérateurs
Bertrand Vassor a écrit :Bonjour,
sur le site CRAN avec le package randomForest, tu trouves : andy_liaw at merck.com comme maintener. C'est la personne à contacter.
https://cran.r-project.org/web/packages/randomForest/
Code : Tout sélectionner
predict(RF, newdata = new_data, type = "prob")[1:10,]
Code : Tout sélectionner
predict(RF, newdata = new_data[1:10,], type = "prob")
Logez Maxime a écrit :re,
Le problème vient de la gestion des facteurs par les fonctions randomForest et predict.randomForest. C'est un point que tu peux signaler au mainteneur.
Dans tes deux tableaux, les variables catégorielles ne sont pas stockées sous forme de facteurs mais de charactères. Et c'est de là ou vient le problème.
Quand tu fais :ouCode : Tout sélectionner
predict(RF, newdata = new_data, type = "prob")[1:10,]
Ce ne sont pas les mêmes modalités qui sont attribuées à la même équipe.Code : Tout sélectionner
predict(RF, newdata = new_data[1:10,], type = "prob")
Pour la première ligne de new_data, pour la HomeTeam, dans le premier cas "Rennes" est associée à la 6ème modalité. Dans le deuxième cas Rennes est associée à la 5ème modalité de "HomeTeam". Ca vient du fait que dans le deuxième cas "Lille" n'apparait pas dans les données et comme il transforme le vecteur de chaîne de caractères en facteur puis il repère dans ce facteur à quelle modalité correspond chaque valeur, dans un cas Renne correspond à la 6ème valeur et dans l'autre cas à la 5ème. Il ne fait pas de correspondance avec les données qui ont été utilisées pour construire les arbres.
Pour éviter ce problème, tu transformes chaque colonne de caractère en facteur pour le jeu de données d'apprentissage et pour le jeu de données test et tu refais tes prédictions. Une fois que tu as fait ça, tu n'as plus de différence dans les prédictions.
C'est clairement un souci de fonctionnement de cette fonction qu'il faut faire remonter au mainteneur.
Cordialement,
Maxime
Code : Tout sélectionner
# 1er cas de figure
x <- factor(new_data$HomeTeam)[1:10]
levels(x)
[1] "Lille" "Lyon" "Marseille" "Monaco" "PSG" "Rennes"
match("Rennes", levels(x))
[1] 6
# si on regarde les 10 valeurs
match(x, levels(x))
[1] 6 5 2 5 2 5 4 5 6 3
# 2eme cas de figure
x2 <- factor(new_data$HomeTeam[1:10])
levels(x2)
[1] "Lyon" "Marseille" "Monaco" "PSG" "Rennes"
match("Rennes", levels(x2))
[1] 5 # parce que Lille a disparu
# si on regarde les 10 valeurs
[1] 5 4 1 4 1 4 3 4 5 2
Logez Maxime a écrit :re,J'espère que c'est plus clair maintenant.Code : Tout sélectionner
# 1er cas de figure
x <- factor(new_data$HomeTeam)[1:10]
levels(x)
[1] "Lille" "Lyon" "Marseille" "Monaco" "PSG" "Rennes"
match("Rennes", levels(x))
[1] 6
# si on regarde les 10 valeurs
match(x, levels(x))
[1] 6 5 2 5 2 5 4 5 6 3
# 2eme cas de figure
x2 <- factor(new_data$HomeTeam[1:10])
levels(x2)
[1] "Lyon" "Marseille" "Monaco" "PSG" "Rennes"
match("Rennes", levels(x2))
[1] 5 # parce que Lille a disparu
# si on regarde les 10 valeurs
[1] 5 4 1 4 1 4 3 4 5 2
Cordialement,
Maxime
P.S : je fais part de ces observations au mainteneur en adaptant ton exemple.
Code : Tout sélectionner
debug(randomForest:::predict.randomForest)
Code : Tout sélectionner
undebug(randomForest:::predict.randomForest)
Logez Maxime a écrit :Bonjour,
Ce qui se passe après, c'est qu'au lieu de faire des prédictions avec les bonnes valeurs, les bons numéros de catégories, tu fais des prédictions avec des valeurs qui ne correspondent pas. C'est ce tableau qui a été mal transcrit qui est utilisé pour obtenir les prédictions pour chaque arbre de ta forêt. Ces arbres ont été définis sur ton jeu d'apprentissage, ils ne changent pas. La fonction predict en modifiant les données d'entrée catégorielles, prédit des valeurs pour des données qui ne sont pas celles pour lesquelles tu as demandé à avoir des prédictions.
Pour mieux se rendre compte de ce qui se passe à l'intérieur d'une fonction étape par étape, tu peux utiliser la fonction "debug". C'est ce que j'ai fait ici.Code : Tout sélectionner
debug(randomForest:::predict.randomForest)
Tu regardes ce qui se passe avec les deux cas de figure. A un moment donné tu verras arriver une grande ligne de commande faisant appel a une fonction en C. A ce moment là tu fais afficher l'objet x, juste en tapant x dans la console et entrée. x est le tableau mis en forme (une matrice transposés) qui sert à calculer les valeurs prédites par les arbres. Tu verras que dans les deux cas, x n'est pas identiques pour les villes mais que les valeurs numériques ne sont pas modifiées.
Une fois que tu as finit n'oublie pas de faireCode : Tout sélectionner
undebug(randomForest:::predict.randomForest)
Sinon a chaque fois que tu vas lancer cette fonction (au cours de la session courante) tu auras le détail par étape.
Ici ça ressemble fort à un fonctionnement indésirable de la fonction, probablement pour un cas de figure qui n'avait pas été pris en compte ou identifié jusqu'à présent, si je ne dis pas de bêtises.
Je vous tiendrai au courant si jamais j'ai un retour.
Cordialement,
Maxime
Retourner vers « Questions en cours »
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité