Saltar al contenido

Ajuste de hiperparámetros usando el paquete de guardabosques puro en R

Esta inquietud se puede solucionar de diversas formas, pero te compartimos la respuesta más completa para nosotros.

Solución:

Para responder a mi pregunta (poco clara), aparentemente el guardabosques no tiene una funcionalidad incorporada de CV/GridSearch. Sin embargo, así es como se ajustan los hiperparámetros con el guardabosques (a través de una búsqueda en cuadrícula) fuera de intercalación. Gracias a Marvin Wright (el mantenedor de ranger) por el código. Resulta que Caret CV con Ranger fue lento para mí porque estaba usando la interfaz de fórmula (que debería evitarse).

ptm <- proc.time()
library(ranger)
library(mlr)

# Define task and learner
task <- makeClassifTask(id = "iris",
                        data = iris,
                        target = "Species")

learner <- makeLearner("classif.ranger")

# Choose resampling strategy and define grid
rdesc <- makeResampleDesc("CV", iters = 5)
ps <- makeParamSet(makeIntegerParam("mtry", 3, 4),
                   makeDiscreteParam("num.trees", 200))

# Tune
res = tuneParams(learner, task, rdesc, par.set = ps,
           control = makeTuneControlGrid())

# Train on entire dataset (using best hyperparameters)
lrn = setHyperPars(makeLearner("classif.ranger"), par.vals = res$x)
m = train(lrn, iris.task)

print(m)
print(proc.time() - ptm) # ~6 seconds

Para los curiosos, el equivalente de intercalación es

ptm <- proc.time()
library(caret)
data(iris)

grid <-  expand.grid(mtry = c(3,4))

fitControl <- trainControl(method = "CV",
                           number = 5,
                           verboseIter = TRUE)

fit = train(
  x = iris[ , names(iris) != 'Species'],
  y = iris[ , names(iris) == 'Species'],
  method = 'ranger',
  num.trees = 200,
  tuneGrid = grid,
  trControl = fitControl
)
print(fit)
print(proc.time() - ptm) # ~2.4 seconds

En general, caret es la forma más rápida de realizar una búsqueda en cuadrícula con ranger si se usa la interfaz sin fórmula.

Creo que hay al menos dos errores:

Primero, la función ranger no tiene un parámetro llamado training_data. Tu mensaje de error Error in ranger(Species ~ ., training_data = iris, num.trees = 200) : unused argument (training_data = iris) se refiere a eso. Puedes ver eso cuando miras ?ranger o args(ranger).

En segundo lugar, la función csrf, por otro lado, tiene training_data como entrada, pero también requiere test_data. Lo que es más importante, estos dos argumentos no tienen valores predeterminados, lo que implica que debe proporcionarlos. Lo siguiente funciona sin problemas:

fit.rf = ranger(
  Species ~ ., data = iris,
  num.trees = 200
)

fit.rf.tune = csrf(
Species ~ .,
training_data = iris,
test_data = iris,
params1 = list(num.trees = 25, mtry=4),
params2 = list(num.trees = 50, mtry=4)
)

Aquí, acabo de proporcionar iris como conjunto de datos de entrenamiento y de prueba. Obviamente no querrías hacer eso en tu aplicación real. Además, tenga en cuenta que ranger también toma num.trees y mtry como entrada, por lo que podría intentar sintonizarlo allí.

Tenga en cuenta que mlr por defecto deshabilita la paralelización interna de ranger. Establecer hiperparámetro num.threads al número de núcleos disponibles para acelerar mlr arriba:

learner <- makeLearner("classif.ranger", num.threads = 4)

Alternativamente, inicie un backend paralelo a través de

parallelStartMulticore(4) # linux/osx
parallelStartSocket(4)    # windows

antes de llamar tuneParams para paralelizar la afinación.

valoraciones y comentarios

Agradecemos que quieras defender nuestra tarea dejando un comentario o puntuándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *