Использование R 3.2.0 с кареткой 6.0-41 и randomForest 4.6-10 на 64-битной машине Linux.
При попытке использовать метод 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()
без формулы? Или я что-то упускаю?
dataTrain
в своем примере, что означает, что проблема не в воспроизводимый. Нелегко помочь вам, если мы не можем запустить код и получить те же результаты, что и вы. - person MrFlick   schedule 07.05.2015dataTrain
должно было бытьimp85
, я отредактировал код в исходном вопросе. Я также удалил параметрdata=imp85
в вызове, в котором явно упоминаютсяx
иy
, поскольку он бесполезен. - person Adrien Combaz   schedule 07.05.2015