He estado usando el ajuste del modelo caret
, pero luego volví a ejecutar el modelo usando el gbm
paquete. Entiendo que el caret
paquete usa gbm
y 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 caret
pero volver a ejecutar gbm
para 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 iris
para mi modelado) .
2) ¿Existen ventajas o desventajas al usar ambos paquetes? De ser así, ¿cuáles?
3) Sin relación: usando el iris
conjunto de datos, el óptimo interaction.depth
es 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`