Использование R 3.2.0 с кареткой 6.0-41 и randomForest 4.6-10 на 64-разрядной машине Linux.Ошибка при использовании функции прогноза() для объекта randomForest, обученного с помощью каретки() с использованием формулы
При попытке использовать метод predict()
на randomForest
объекте обученного с функцией train()
из caret
пакета, используя формулу, функция возвращает ошибку. При обучении через randomForest()
и/или используя x=
и y=
, а не формулу, все работает плавно.
Вот рабочий пример:
library(randomForest)
library(caret)
data(imports85)
imp85 <- imports85[, c("stroke", "price", "fuelType", "numOfDoors")]
imp85 <- imp85[complete.cases(imp85), ]
imp85[] <- lapply(imp85, function(x) if (is.factor(x)) x[,drop=TRUE] else x) ## Drop empty levels for factors.
modRf1 <- randomForest(numOfDoors~., data=imp85)
caretRf <- train(numOfDoors~., data=imp85, method = "rf")
modRf2 <- caretRf$finalModel
modRf3 <- randomForest(x=imp85[,c("stroke", "price", "fuelType")], y=imp85[, "numOfDoors"])
caretRf <- train(x=imp85[,c("stroke", "price", "fuelType")], y=imp85[, "numOfDoors"], method = "rf")
modRf4 <- caretRf$finalModel
p1 <- predict(modRf1, newdata=imp85)
p2 <- predict(modRf2, newdata=imp85)
p3 <- predict(modRf3, newdata=imp85)
p4 <- predict(modRf4, newdata=imp85)
Среди последних 4-х строк, только второй один p2 <- predict(modRf2, newdata=imp85)
возвращает следующее сообщение об ошибке:
Error in predict.randomForest(modRf2, newdata = imp85) :
variables in the training data missing in newdata
Представляется, что причиной этой ошибки является то, что метод predict.randomForest
использует rownames(object$importance)
для определения имени переменных, используемых для обучения случайному лесу object
. А если смотреть на
rownames(modRf1$importance)
rownames(modRf2$importance)
rownames(modRf3$importance)
rownames(modRf4$importance)
Мы видим:
[1] "stroke" "price" "fuelType"
[1] "stroke" "price" "fuelTypegas"
[1] "stroke" "price" "fuelType"
[1] "stroke" "price" "fuelType"
Так или иначе, при использовании функции caret
train()
с формулой меняет название (фактор) переменные в importance
поле randomForest
объекта ,
Это действительно несоответствие между формулой и не-формулой версии функции каттера train()
? Или я чего-то не хватает?
'modRf3 <- RandomForest (х = dataTrain [с ("инсульт", "цена", "fuelType")], у = dataTrain [, "numOfDoors"], данные = imp85) Ошибка randomForest (x = dataTrain [, c ("stroke", "price", "fuelType")],: объект 'dataTrain' не найден' –
Как вы указали, вы не определили 'dataTrain' в вашем примере, что означает проблема не является [воспроизводимой] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Нелегко помочь вам, если мы не сможем запустить код и получите те же результаты, что и вы. – MrFlick
Мой плохой 'dataTrain' должен был быть' imp85', я отредактировал код в исходном вопросе. Я также удалил опцию 'data = imp85' в вызове, где' x' и ' y' явно упоминаются как t здесь бесполезно. –