Подтвердить что ты не робот

Случайные леса в R (пустые классы по y и аргумент legth 0)

Я имею дело в первый раз со случайными лесами, и у меня возникают проблемы, которые я не могу понять. Когда я запускаю анализ всего моего набора данных (около 3000 строк), я не получаю сообщение об ошибке. Но когда я выполняю тот же анализ на подмножестве своего набора данных (около 300 строк), я получаю сообщение об ошибке:

dataset <- read.csv("datasetNA.csv", sep=";", header=T)
names (dataset)
dataset2 <- dataset[complete.cases(dataset$response),]
library(randomForest)
dataset2 <- na.roughfix(dataset2)
data.rforest <- randomForest(dataset2$response ~ dataset2$predictorA + dataset2$predictorB+ dataset2$predictorC + dataset2$predictorD + dataset2$predictorE + dataset2$predictorF + dataset2$predictorG + dataset2$predictorH + dataset2$predictorI, data=dataset2, ntree=100, keep.forest=FALSE, importance=TRUE)

# subset of my original dataset:
groupA<-dataset2[dataset2$order=="groupA",]
data.rforest <- randomForest(groupA$response ~ groupA$predictorA + groupA$predictorB+ groupA$predictorC + groupA$predictorD + groupA$predictorE + groupA$predictorF + groupA$predictorG + groupA$predictorH + groupA$predictorI, data=groupA, ntree=100, keep.forest=FALSE, importance=TRUE)

Error in randomForest.default(m, y, ...) : Can't have empty classes in y.

Однако моя переменная ответа не имеет пустого класса.

Если вместо этого я пишу randomForest, как это (a+b+c,y) вместо (y ~ a+b+c), я получаю это другое сообщение:

Error in if (n == 0) stop("data (x) has 0 rows") : 
  argument length zero
Warning messages:
1: In Ops.factor(groupA$responseA + groupA$responseB,  :
  + not meaningful for factors

Вторая проблема заключается в том, что когда я пытаюсь ввести свои данные через rfImpute(), я получаю сообщение об ошибке:

Errore in na.roughfix.default(x) :  roughfix can only deal with numeric data

Однако мои столбцы - все факторы и числовые.

Может кто-нибудь увидеть, где я ошибаюсь???

4b9b3361

Ответ 1

Основываясь на обсуждении в комментариях, предположим, что это потенциальное решение.

Путаница здесь возникает из-за того, что уровни фактора являются атрибутом переменной. Эти уровни останутся неизменными, независимо от того, какое подмножество вы берете за данные, независимо от того, насколько малы это подмножество. Это особенность, а не ошибка и общий источник путаницы.

Если вы хотите удалить отсутствующие уровни при подмножестве, заверните операцию подмножества в droplevels():

groupA <- droplevels(dataset2[dataset2$order=="groupA",])

Я должен, вероятно, добавить, что многие пользователи R установили options(stringsAsFactors = FALSE) при запуске нового сеанса (например, в файле .Rprofile), чтобы избежать таких неприятностей. Недостатком этого является то, что если вы часто делитесь своим кодом с другими людьми, это может вызвать проблемы, если они не изменили параметры по умолчанию R.

Ответ 2

Когда уровни факторов удаляются подмножеством, вы должны reset уровней:

levels(train11$str);
[1] "B" "D" "E" "G" "H" "I" "O" "T" "X" "Y" "b";
train11$str <- factor(train11$str);
levels(train11$str);
[1] "B" "D" "E" "G" "H" "I" "O" "T" "b"

Ответ 3

Попробуйте использовать формулу функции, прежде чем передавать ее в randomForest:

formula("y ~ a+b+c")

Это устранило проблему для меня.

Или может случиться, что randomForest ошибочно принимает параметр для другого.

Попробуйте указать, что каждый параметр:

randomForest(,,, data=my_data, mtry=my_mtry, etc)

Ответ 4

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

dataset2 $response < - factor (ответ набора данных 2 $)

для удаления дополнительных уровней, отсутствующих в данных, после настройки sub.

Ответ 5

Кажется, проблема в заявлении вызова. Если вы используете интерфейс формулы, вызовите

randomForest(response ~ predictorA + predictorB + ... + predictorI, data=groupA, ntree=100, keep.forest=FALSE, importance=TRUE)

Но удобнее и быстрее передавать явно x и y

randomForest(y = groupA$response, x = groupA[,c("predictorA", "predictorB", ...)], ntree=100, keep.forest=FALSE, importance=TRUE)

Вместо имен переменных вы можете использовать их индексы. Попробуйте эти предложения.

Ответ 6

Еще одно предложение добавить в микс: есть вероятность, что read.csv() не будет интерпретировать строки как факторы. Попробуйте добавить это к read.csv для принудительного преобразования в символы:

dataset <- read.csv("datasetNA.csv", 
                    sep=";", 
                    header=T,
                    colClasses="character")

Ответ 7

У меня была такая же проблема с тобой сегодня, и я решил ее решить. Когда вы делаете Random Forest, R по умолчанию является классификацией, а мой ответ численным. Когда вы используете подмножества в качестве набора учебных материалов, уровни обучения ограничены по сравнению с тестом.