Как исправить: randomForest.default(m, y, …): Na/NaN/Inf в вызове сторонней функции


Одна ошибка, с которой вы можете столкнуться в R:

Error in randomForest.default(m, y, ...) : 
 NA/NaN/Inf in foreign function call (arg 1)

Есть две причины возникновения этой ошибки:

  • В наборе данных есть значения NA, NaN или Inf.
  • Одна из переменных в наборе данных является символом

Самый простой способ исправить эту ошибку — удалить строки с отсутствующими данными и преобразовать символьные переменные в факторные переменные:

#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 )

В этом руководстве приводится пример того, как исправить эту ошибку на практике.

Связанный: Как построить случайные леса в R (шаг за шагом)

Как воспроизвести ошибку

Предположим, мы пытаемся подогнать случайный лес к следующему фрейму данных в 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)

Мы получаем ошибку, потому что x1 является символьной переменной во фрейме данных.

Мы можем подтвердить это, используя функцию str() для просмотра структуры фрейма данных:

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

Как исправить ошибку

Чтобы исправить эту ошибку, мы можем использовать функцию mutate_if() из dplyr для преобразования каждого столбца символов в столбец факторов:

library(dplyr)

#convert each character column to factor
df = df %>% mutate_if(is. character , as. factor )

Затем мы можем подогнать модель случайного леса к фрейму данных:

#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

На этот раз мы не получаем никакой ошибки, потому что во фрейме данных больше нет символьных переменных.

Дополнительные ресурсы

В следующих руководствах объясняется, как устранять другие распространенные ошибки в R:

Как исправить: условие имеет длину > 1 и будет использоваться только первый элемент
Как исправить в R: dim(X) должен иметь положительную длину
Как исправить в R: отсутствует значение там, где нужно true/false
Как исправить: NA, введенные принуждением

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.