Fonction predict()

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Bertrand Vassor
Messages : 46
Enregistré le : 18 Sep 2017, 10:18

Re: Fonction predict()

Messagepar Bertrand Vassor » 11 Jan 2023, 10:26

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/

Maxime Deniaux
Messages : 70
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: Fonction predict()

Messagepar Maxime Deniaux » 11 Jan 2023, 10:30

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/


Arf pas pensé à regarder sur le CRAN...

Je reviendrai ici écrire ce qu'il me dit si j'ai un réponse !

Merci à vous tous ! Bonne journée

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Fonction predict()

Messagepar Logez Maxime » 11 Jan 2023, 12:53

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 :

Code : Tout sélectionner

predict(RF, newdata = new_data, type = "prob")[1:10,]
ou

Code : Tout sélectionner

predict(RF, newdata = new_data[1:10,], type = "prob")
Ce ne sont pas les mêmes modalités qui sont attribuées à la même équipe.
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

Maxime Deniaux
Messages : 70
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: Fonction predict()

Messagepar Maxime Deniaux » 11 Jan 2023, 13:29

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 :

Code : Tout sélectionner

predict(RF, newdata = new_data, type = "prob")[1:10,]
ou

Code : Tout sélectionner

predict(RF, newdata = new_data[1:10,], type = "prob")
Ce ne sont pas les mêmes modalités qui sont attribuées à la même équipe.
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


Re !

Merci pour l'énergie déployée :')

Tu sembles avoir compris le problème donc...c'est super. Mais j'ai un peu de mal à suivre l'explication que j'ai mis en gras. Ca aurait été plus facile avec une ou deux illustrations.

Pourquoi Rennes passe en 5ème modalité pour HomeTeam dans le 2nd cas? (je vois que tu l'expliques juste après mais j'ai du mal à comprendre à quel moment ça bouge pour que les 10 lignes sélectionnées ne soient plus identiques).
Je me rends pas compte à quel point ça serait difficile de l'illustrer. Quand je dis illustrer, je ne parle pas de dessins, juste du code/img.

Bien compris la conclusion mais je ne peux pas décrire le problème au mainteneur si je ne le comprends pas bien !
(d'ailleurs si je ne comprends toujours pas après, et que tu as le temps, tu peux le faire toi étant donné que tu sembles pour l'instant le seul à avoir bien compris le soucis...)

Merci pour le temps pris !

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Fonction predict()

Messagepar Logez Maxime » 11 Jan 2023, 13:38

re,

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
J'espère que c'est plus clair maintenant.

Cordialement,
Maxime

P.S : je fais part de ces observations au mainteneur en adaptant ton exemple.

Maxime Deniaux
Messages : 70
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: Fonction predict()

Messagepar Maxime Deniaux » 12 Jan 2023, 09:22

Logez Maxime a écrit :re,

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
J'espère que c'est plus clair maintenant.

Cordialement,
Maxime

P.S : je fais part de ces observations au mainteneur en adaptant ton exemple.


Salut,

oui d'accord pour le passage en 5eme modalité, j'ai compris. Ce que j'ai encore du mal à comprendre, c'est ce qu'il se passe encore après... ! Mais bon, c'est rentrer vraiment dans le détail et par message c'est difficile.

Oui je veux bien pour rapporter le problème, c'est mieux si c'est décrit par quelqu'un qui comprend de bout en bout ce qu'il se passe, merci beaucoup !

Puis tu as donné la solution plus haut en plus, donc parfait.

Bonne journée et a+ sur le forum... :)

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Fonction predict()

Messagepar Logez Maxime » 12 Jan 2023, 09:55

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 faire

Code : 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

Maxime Deniaux
Messages : 70
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: Fonction predict()

Messagepar Maxime Deniaux » 16 Jan 2023, 09:09

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 faire

Code : 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



Salut,

merci pour les explications. J'avoue que j'utilise jamais les fonctions de débugage, je ne sais pas du tout m'en servir.
Mais j'ai essayé de suivre tes indications et effectivement, j'ai cru voir à un moment qu'il y avait un souci avec ces histoires de niveau de facteurs comme tu l'avais expliqué plus haut.

Mais j'essaierai de me documenter sur comment utiliser correctement cette fonction, ce n'est pas encore bien clair.

Bonne journée


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité