Я хочу исследовать влияние переменной на мою переменную отклика данных, которые я анализирую. Пакет каретки в R дает возможность настроить параметры модели на основе, например, перекрестной проверки, для которой можно определить сетку настройки. Однако я заметил, что результаты модели окончательной модели зависят от выбора сетки настройки для параметра настройки mtry . Из документации я подумал, что окончательная модель будет равна радиочастотной модели с использованием bestTune, независимо от тестируемого диапазона настройки, поэтому я удивлен, наблюдая это. Похоже, что у последней модели есть другие модели в памяти. К сожалению, это также влияет на значения переменных и результаты перекрестной проверки, которые я хочу исследовать. Итак, мой вопрос: я неправильно понял метод? Может кто-нибудь объяснить это наблюдение? Или это ошибка в пакете карет?
Минимальный пример:
library(caret) # current version 6.0-84
set.seed(234)
data <- data.frame(replicate(10, rnorm(n = 100)))
train_control <- trainControl(method="repeatedcv", number=10, repeats=3, p=0.8,
selectionFunction = "tolerance",returnResamp="final", returnData = TRUE)
# tuning grid 1
rfGrid <- expand.grid(mtry=1:8)
set.seed(234)
modelrf <- train(X1~., data=data, trControl=train_control, ntree=100,
method="rf", tuneGrid=rfGrid, importance=TRUE,
preProcess=c("center","scale"))
# evaluate
residuals <- data[,"X1"]-modelrf$finalModel$predicted
R2 <- 1 - sum((residuals)^2)/sum((data[,"X1"]-mean(data[,"X1"]))^2)
print(paste("Tuned mtry=", modelrf$bestTune, ", R2=", R2))
varImp(modelrf)
приводит к:
> print(paste("Tuned mtry=", modelrf$bestTune, ", R2=", R2))
[1] "Tuned mtry= 1 , R2= -0.0918368221777204"
> varImp(modelrf)
rf variable importance
Overall
X7 100.000
X3 81.926
X8 73.912
X9 50.008
X10 46.382
X6 34.118
X2 15.852
X5 3.944
X4 0.000
, в то время как другая сетка настройки приводит к другому результату, даже если bestTune такой же
# tuning grid 2
rfGrid <- expand.grid(mtry=1:5)
set.seed(234)
modelrf <- train(X1~., data=data, trControl=train_control, ntree=100,
method="rf", tuneGrid=rfGrid, importance=TRUE,
preProcess=c("center","scale"))
# evaluate
residuals <- data[,"X1"]-modelrf$finalModel$predicted
R2 <- 1 - sum((residuals)^2)/sum((data[,"X1"]-mean(data[,"X1"]))^2)
print(paste("Tuned mtry=", modelrf$bestTune, ", R2=", R2))
varImp(modelrf)
приводит к:
> print(paste("Tuned mtry=", modelrf$bestTune, ", R2=", R2))
[1] "Tuned mtry= 1 , R2= -0.0147000616001627"
> varImp(modelrf)
rf variable importance
Overall
X8 100.0000
X7 93.9723
X4 92.9581
X6 84.3003
X9 68.4687
X3 64.0240
X10 35.3509
X2 0.5545
X5 0.0000
Почему оба результата отличаются друг от друга?