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.