He estado usando el ajuste del modelo caret, pero luego volví a ejecutar el modelo usando el gbmpaquete. Entiendo que el caretpaquete usa gbmy el resultado debe ser el mismo. Sin embargo, solo una ejecución de prueba rápida usando data(iris)muestra una discrepancia en el modelo de aproximadamente 5% usando RMSE y R ^ 2 como la métrica de evaluación. Quiero encontrar el rendimiento óptimo del modelo usando caretpero volver a ejecutar gbmpara hacer uso de las parcelas de dependencia parcial. Código a continuación para la reproducibilidad.
Mis preguntas serían:
1) ¿Por qué veo una diferencia entre estos dos paquetes a pesar de que deberían ser los mismos? (Entiendo que son estocásticos, pero el 5% es una gran diferencia, especialmente cuando no estoy usando un conjunto de datos tan bueno como irispara mi modelado) .
2) ¿Existen ventajas o desventajas al usar ambos paquetes? De ser así, ¿cuáles?
3) Sin relación: usando el irisconjunto de datos, el óptimo interaction.depthes 5, sin embargo, es más alto de lo que he leído, debería ser el máximo usando floor(sqrt(ncol(iris)))2. ¿Es esta una regla general estricta o es bastante flexible?
library(caret)
library(gbm)
library(hydroGOF)
library(Metrics)
data(iris)
# Using caret
caretGrid <- expand.grid(interaction.depth=c(1, 3, 5), n.trees = (0:50)*50,
shrinkage=c(0.01, 0.001),
n.minobsinnode=10)
metric <- "RMSE"
trainControl <- trainControl(method="cv", number=10)
set.seed(99)
gbm.caret <- train(Sepal.Length ~ ., data=iris, distribution="gaussian", method="gbm",
trControl=trainControl, verbose=FALSE,
tuneGrid=caretGrid, metric=metric, bag.fraction=0.75)
print(gbm.caret)
# caret determines the optimal model to be at n.tress=700, interaction.depth=5, shrinkage=0.01
# and n.minobsinnode=10
# RMSE = 0.3247354
# R^2 = 0.8604
# Using GBM
set.seed(99)
gbm.gbm <- gbm(Sepal.Length ~ ., data=iris, distribution="gaussian", n.trees=700, interaction.depth=5,
n.minobsinnode=10, shrinkage=0.01, bag.fraction=0.75, cv.folds=10, verbose=FALSE)
best.iter <- gbm.perf(gbm.gbm, method="cv")
print(best.iter)
# Here the optimal n.trees = 540
train.predict <- predict.gbm(object=gbm.gbm, newdata=iris, 700)
print(rmse(iris$Sepal.Length, train.predict))
# RMSE = 0.2377
R2 <- cor(gbm.gbm$fit, iris$Sepal.Length)^2
print(R2)
# R^2 = 0.9178`
fuente
