Paquete GBM vs. Caret usando GBM

13

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`
Danib90
fuente

Respuestas:

6

Úselo con la cuadrícula predeterminada para optimizar los parámetros y use predecir para tener los mismos resultados:

R2.caret-R2.gbm = 0.0009125435

rmse.caret-rmse.gbm = -0.001680319

library(caret)
library(gbm)
library(hydroGOF)
library(Metrics)
data(iris)

# Using caret with the default grid to optimize tune parameters automatically
# GBM Tuning parameters:
# n.trees (# Boosting Iterations)
# interaction.depth (Max Tree Depth)
# shrinkage (Shrinkage)
# n.minobsinnode (Min. Terminal Node Size)

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.predict <- predict(gbm.caret, newdata=iris, type="raw")

rmse.caret<-rmse(iris$Sepal.Length, caret.predict)
print(rmse.caret)

R2.caret <- cor(gbm.caret$finalModel$fit, iris$Sepal.Length)^2
print(R2.caret)

#using gbm without caret with the same parameters
set.seed(99)
gbm.gbm <- gbm(Sepal.Length ~ .
               , data=iris
               , distribution="gaussian"
               , n.trees=150
               , interaction.depth=3
               , n.minobsinnode=10
               , shrinkage=0.1
               , bag.fraction=0.75
               , cv.folds=10
               , verbose=FALSE
               )
best.iter <- gbm.perf(gbm.gbm, method="cv")
print(best.iter)

train.predict <- predict.gbm(object=gbm.gbm, newdata=iris, 150)

rmse.gbm<-rmse(iris$Sepal.Length, train.predict)
print(rmse.gbm)

R2.gbm <- cor(gbm.gbm$fit, iris$Sepal.Length)^2
print(R2.gbm)

print(R2.caret-R2.gbm)
print(rmse.caret-rmse.gbm)
42n4
fuente