Comment réparer : randomForest.default(m, y, …) : Na/NaN/Inf dans l’appel de fonction étrangère
Une erreur que vous pouvez rencontrer dans R est :
Error in randomForest.default(m, y, ...) : NA/NaN/Inf in foreign function call (arg 1)
Cette erreur peut se produire pour deux raisons :
- Il y a des valeurs NA, NaN ou Inf dans l’ensemble de données
- L’une des variables de l’ensemble de données est un caractère
Le moyen le plus simple de corriger cette erreur consiste à supprimer les lignes contenant des données manquantes et à convertir les variables de caractères en variables de facteur :
#remove rows with missing values df <- na.omit(df) #convert all character variables to factor variables library(dplyr) df %>% mutate_if(is.character, as.factor)
Ce didacticiel partage un exemple de la façon de corriger cette erreur dans la pratique.
Connexes : Comment créer des forêts aléatoires dans R (étape par étape)
Comment reproduire l’erreur
Supposons que nous essayions d’adapter une forêt aléatoire au bloc de données suivant dans R :
library(randomForest)
#create data frame
df <- data.frame(y <- c(30, 29, 30, 45, 23, 19, 9, 8, 11, 14),
x1 <- c('A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C'),
x2 <- c(4, 4, 5, 7, 8, 7, 9, 6, 13, 15))
#attempt to fit random forest model
model <- randomForest(formula = y ~ ., data = df)
Error in randomForest.default(m, y, ...) :
NA/NaN/Inf in foreign function call (arg 1)
Nous recevons une erreur car x1 est une variable de caractère dans le bloc de données.
Nous pouvons le confirmer en utilisant la fonction str() pour afficher la structure du bloc de données :
str(df)
'data.frame': 10 obs. of 3 variables:
$ y....c.30..29..30..45 : num 30 29 30 45 23 19 9 8 11 14
$ x1....c..A....A....B....B.... : chr "A" "A" "B" "B"
$ x2....c.4..4..5..7.. : num 4 4 5 7 8 7 9 6 13 15
Comment réparer l’erreur
Pour corriger cette erreur, nous pouvons utiliser la fonction mutate_if() de dplyr pour convertir chaque colonne de caractères en colonne de facteurs :
library(dplyr)
#convert each character column to factor
df = df %>% mutate_if(is.character, as.factor)
Nous pouvons ensuite ajuster le modèle de forêt aléatoire au bloc de données :
#fit random forest model
model <- randomForest(formula = y ~ ., data = df)
#view summary of model
model
Call:
randomForest(formula = y ~ ., data = df)
Type of random forest: regression
Number of trees: 500
No. of variables tried at each split: 1
Mean of squared residuals: 65.0047
% Var explained: 48.64
Nous ne recevons aucune erreur cette fois car il n’y a plus de variables de caractères dans la trame de données.
Ressources additionnelles
Les didacticiels suivants expliquent comment résoudre d’autres erreurs courantes dans R :
Comment réparer : la condition a une longueur > 1 et seul le premier élément sera utilisé
Comment réparer dans R : dim(X) doit avoir une longueur positive
Comment réparer dans R : valeur manquante là où vrai/faux est nécessaire
Comment réparer : les NA introduites par la coercition