Modérateur : Groupe des modérateurs
Facundo Muñoz a écrit :Bonjour Maxime,
Je comprends la question, mais à priori je n'ai pas de réponse. Quelques pistes :
1. D'abord, la fonction predict() est "générique". C'est à dire que elle se comporte différemment en fonction de la classe de l'objet "modele_RF". Il faudrait lire la documentation de cette méthode pour bien comprendre comment elle fonctionne.
2. Ce serait un bon exercice d'essayer de faire un exemple réproductible minimale avec des données bidon, pour voir si on peut reproduire ce comportement. On identifie souvent la source des problèmes juste en essayant de les reproduire dans un autre contexte, de zéro. De plus, si vous avez un exemple reproductible, on pourra vous aider plus facilement.
Cordialement,
Code : Tout sélectionner
# Les equipes pour former le dataset :
HomeTeam = c("Monaco","Marseille","PSG","Lille","Lyon","Rennes")
AwayTeam = c("Strasbourg","Reims","Troyes","Brest","Lorient","Nice")
# Tirages au sort successifs :
dataset = data.frame(HomeTeam = sample(HomeTeam,500,replace = T),
AwayTeam = sample(AwayTeam,500,replace = T),
Home_Odd = sample(seq(1,1.5,0.05),500,replace = T),
Away_Odd = sample(seq(2,5,0.05),500,replace = T),
Draw_Odd = sample(seq(2.8,10,0.05),500,replace = T),
FTR = sample(c("H","D","A"),500,replace = T)
)
# Variable a prédire, à mettre en facteur sinon random forest ne fonctionne pas :
dataset$FTR = factor(dataset$FTR)
# Random forest :
RF <- randomForest::randomForest(FTR ~ .,
data = dataset ,
importance = TRUE,
na.action = na.omit,
ntree = 500)
# Les nouvelles données pour faire des predictions :
new_data = data.frame(HomeTeam = sample(HomeTeam,50,replace = T),
AwayTeam = sample(AwayTeam,50,replace = T),
Home_Odd = sample(seq(1,1.5,0.05),50,replace = T),
Away_Odd = sample(seq(2,5,0.05),50,replace = T),
Draw_Odd = sample(seq(2.8,10,0.05),50,replace = T)
)
# Predictions :
# 1) sur toutes les lignes de new_data avec affichage des 10 premières
# 2) sur les 10 premières lignes de new_data :
predict(RF, new_data, type = 'prob')[1:10,]
predict(RF, new_data[1:10,], type = 'prob')
predict(RF, new_data)[1:10]
predict(RF, new_data[1:10,])
Code : Tout sélectionner
# Les equipes pour former le dataset :
HomeTeam = c("Monaco","Marseille","PSG","Lille","Lyon","Rennes")
AwayTeam = c("Strasbourg","Reims","Troyes","Brest","Lorient","Nice")
# Tirages au sort successifs :
dataset = data.frame(
HomeTeam = sample(HomeTeam,500,replace = T),
AwayTeam = sample(AwayTeam,500,replace = T),
Home_Odd = sample(seq(1,1.5,0.05),500,replace = T),
Away_Odd = sample(seq(2,5,0.05),500,replace = T),
Draw_Odd = sample(seq(2.8,10,0.05),500,replace = T),
FTR = sample(c("H","D","A"),500,replace = T)
)
# Variable a prédire, à mettre en facteur sinon random forest ne fonctionne pas :
dataset$FTR = factor(dataset$FTR)
# Random forest :
RF <- randomForest::randomForest(
FTR ~ .,
data = dataset ,
importance = TRUE,
na.action = na.omit,
ntree = 500)
# Les nouvelles données pour faire des predictions :
new_data = data.frame(
HomeTeam = sample(HomeTeam,50,replace = T),
AwayTeam = sample(AwayTeam,50,replace = T),
Home_Odd = sample(seq(1,1.5,0.05),50,replace = T),
Away_Odd = sample(seq(2,5,0.05),50,replace = T),
Draw_Odd = sample(seq(2.8,10,0.05),50,replace = T)
)
# Predictions :
# 1) sur toutes les lignes de new_data avec affichage des 10 premières
# 2) sur les 10 premières lignes de new_data :
predict(RF, new_data, type = 'prob')[1:10,]
#> A D H
#> 1 0.354 0.316 0.330
#> 2 0.300 0.522 0.178
#> 3 0.498 0.220 0.282
#> 4 0.312 0.240 0.448
#> 5 0.258 0.390 0.352
#> 6 0.136 0.194 0.670
#> 7 0.294 0.378 0.328
#> 8 0.276 0.502 0.222
#> 9 0.152 0.304 0.544
#> 10 0.354 0.350 0.296
predict(RF, new_data[1:10,], type = 'prob')
#> A D H
#> 1 0.354 0.316 0.330
#> 2 0.300 0.522 0.178
#> 3 0.498 0.220 0.282
#> 4 0.276 0.218 0.506
#> 5 0.258 0.390 0.352
#> 6 0.116 0.288 0.596
#> 7 0.234 0.372 0.394
#> 8 0.276 0.502 0.222
#> 9 0.152 0.304 0.544
#> 10 0.446 0.428 0.126
#> attr(,"class")
#> [1] "matrix" "array" "votes"
predict(RF, new_data)[1:10]
#> 1 2 3 4 5 6 7 8 9 10
#> A D A H D H D D H A
#> Levels: A D H
predict(RF, new_data[1:10,])
#> 1 2 3 4 5 6 7 8 9 10
#> A D A H D H H D H A
#> Levels: A D H
Code : Tout sélectionner
...
predict(RF, new_data, type = 'prob')[1,]
#> A D H
#> 0.2431835 0.4532056 0.3036109
predict(RF, new_data, type = 'prob')[2,]
#> A D H
#> 0.5151069 0.1400147 0.3448784
predict(RF, new_data, type = 'prob')[3,]
#> A D H
#> 0.3006632 0.5460575 0.1532793
predict(RF, new_data[1,], type = 'prob')
#> A D H
#> 1 0.1495947 0.4377303 0.412675
#> attr(,"class")
#> [1] "matrix" "array" "votes"
predict(RF, new_data[2,], type = 'prob')
#> A D H
#> 2 0.3655122 0.1260133 0.5084746
#> attr(,"class")
#> [1] "matrix" "array" "votes"
predict(RF, new_data[3,], type = 'prob')
#> A D H
#> 3 0.2343405 0.3728814 0.3927782
#> attr(,"class")
#> [1] "matrix" "array" "votes"
Facundo Muñoz a écrit :Non, je n'obtiens pas le même résultat en faisant les prédictions des matchs individuels :Code : Tout sélectionner
...
predict(RF, new_data, type = 'prob')[1,]
#> A D H
#> 0.2431835 0.4532056 0.3036109
predict(RF, new_data, type = 'prob')[2,]
#> A D H
#> 0.5151069 0.1400147 0.3448784
predict(RF, new_data, type = 'prob')[3,]
#> A D H
#> 0.3006632 0.5460575 0.1532793
predict(RF, new_data[1,], type = 'prob')
#> A D H
#> 1 0.1495947 0.4377303 0.412675
#> attr(,"class")
#> [1] "matrix" "array" "votes"
predict(RF, new_data[2,], type = 'prob')
#> A D H
#> 2 0.3655122 0.1260133 0.5084746
#> attr(,"class")
#> [1] "matrix" "array" "votes"
predict(RF, new_data[3,], type = 'prob')
#> A D H
#> 3 0.2343405 0.3728814 0.3927782
#> attr(,"class")
#> [1] "matrix" "array" "votes"
Je suis sur R 4.2.2.
Louaï Benseghir a écrit :Bonsoir à tous,
Je ne suis pas très sûr, mais il me semble que le problème vient du choix de l'échantillon d'apprentissage et de test qu'utilise R à chaque essai. En effet, à chaque fois que vous appliquez la fonction d'apprentissage, R prend au hasard des observations du jeux de données. Donc, si à chaque apprentissage le jeux de données est différent alors le modèle est forcément différent, est donc les résultats de prédiction le seront forcément. De plus, si l'échantillon d'apprentissage est différent la partition de test le sera aussi, et donc en sortie de la fonction predict() les lignes ne correspondront pas aux mêmes matches à chaque essai, ce pourquoi, vous n'avez pas les mêmes valeurs de prédiction à chaque fois.
Pour que R tire au hasard le même échantillon de données, utilisez la fonction set.seed() avant chaque fonction :
Avant chaque fonction de création de variable dépendante et indépendantes tel que sample() et avant la fonction d'apprentissage du modèle.
En principe comme ça vous aurez le même résultat de prédiction à chaque fois.
Bon courage.
Bertrand Vassor a écrit :Bonjour Maxime,
pourquoi ne pas contacter la personne qui maintient la library ?
Cdlt. B
Code : Tout sélectionner
methods("predict")
Logez Maxime a écrit :Bonjour,
Attention, comme il l'a déjà été précisé dans le fil de cette discussion la fonction predict est une fonction "générique". Autrement dit elle va chercher la fonction "predict.classe" qui est rattachée à la classe de ton objet et si elle n'en trouve pas cherchera la fonction par défaut ("predict.default" qui n'a pas été implémentée).
C'est pour ça que tu peux utiliser la même fonction avec des modèles de type "lm", "glm", "gam", etc. et donc aussi de ton random forest.
Pour savoir toutes les fonctions accessibles depuis la fonction générique tu peux faire.Code : Tout sélectionner
methods("predict")
Normalement en faisant ça tu verras qu'il existe la fonction "predict.randomForest" (si tu as chargé le package).
C'est aux auteurs de cette fonction que tu dois écrire et non aux auteurs de la fonction predict (de la fonction générique), parce que c'est elle qui va être utilisée infine pour renvoyer les prédictions de ton random forest.
Sur la page du package tu trouveras l'adresse mail de l'auteur, a qui tu pourras écrire directement et lui poser ta question.
Cordialement,
Maxime
Retourner vers « Questions en cours »
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité