vignettes/tutorial/devel/advanced_tune.Rmd
advanced_tune.RmdThe package supports a larger number of tuning algorithms, which can all be looked up and selected via TuneControl(). One of the cooler algorithms is iterated F-racing from the irace::irace() package (technical description here). This not only works for arbitrary parameter types (numeric, integer, discrete, logical), but also for so-called dependent / hierarchical parameters:
ps = makeParamSet(
makeNumericParam("C", lower = -12, upper = 12, trafo = function(x) 2^x),
makeDiscreteParam("kernel", values = c("vanilladot", "polydot", "rbfdot")),
makeNumericParam("sigma", lower = -12, upper = 12, trafo = function(x) 2^x,
requires = quote(kernel == "rbfdot")),
makeIntegerParam("degree", lower = 2L, upper = 5L,
requires = quote(kernel == "polydot"))
)
ctrl = makeTuneControlIrace(maxExperiments = 200L)
rdesc = makeResampleDesc("Holdout")
res = tuneParams("classif.ksvm", iris.task, rdesc, par.set = ps, control = ctrl, show.info = FALSE)
print(head(as.data.frame(res$opt.path)))
## C kernel sigma degree mmce.test.mean dob eol
## 1 -7.8580323 rbfdot 9.866508 NA 0.70 1 NA
## 2 1.9206910 vanilladot NA NA 0.02 1 NA
## 3 -7.5432793 vanilladot NA NA 0.32 1 NA
## 4 -0.1266970 vanilladot NA NA 0.00 1 NA
## 5 0.1295069 vanilladot NA NA 0.00 1 NA
## 6 9.0493172 vanilladot NA NA 0.04 1 NA
## error.message exec.time
## 1 <NA> 0.039
## 2 <NA> 0.755
## 3 <NA> 0.011
## 4 <NA> 0.011
## 5 <NA> 0.010
## 6 <NA> 0.010See how we made the kernel parameters like sigma and degree dependent on the kernel selection parameters? This approach allows you to tune parameters of multiple kernels at once, efficiently concentrating on the ones which work best for your given data set.
We can now take the following example even one step further. If we use the makeModelMultiplexer() we can tune over different model classes at once, just as we did with the SVM kernels above.
base.learners = list(
makeLearner("classif.ksvm"),
makeLearner("classif.randomForest")
)
lrn = makeModelMultiplexer(base.learners)Function makeModelMultiplexerParamSet() offers a simple way to construct a parameter set for tuning: The parameter names are prefixed automatically and the requires element is set, too, to make all parameters subordinate to selected.learner.
ps = makeModelMultiplexerParamSet(lrn,
makeNumericParam("sigma", lower = -12, upper = 12, trafo = function(x) 2^x),
makeIntegerParam("ntree", lower = 1L, upper = 500L)
)
print(ps)
## Type len Def
## selected.learner discrete - -
## classif.ksvm.sigma numeric - -
## classif.randomForest.ntree integer - -
## Constr Req Tunable
## selected.learner classif.ksvm,classif.randomForest - TRUE
## classif.ksvm.sigma -12 to 12 Y TRUE
## classif.randomForest.ntree 1 to 500 Y TRUE
## Trafo
## selected.learner -
## classif.ksvm.sigma Y
## classif.randomForest.ntree -
rdesc = makeResampleDesc("CV", iters = 2L)
ctrl = makeTuneControlIrace(maxExperiments = 200L)
res = tuneParams(lrn, iris.task, rdesc, par.set = ps, control = ctrl, show.info = FALSE)
print(head(as.data.frame(res$opt.path)))
## selected.learner classif.ksvm.sigma classif.randomForest.ntree
## 1 classif.randomForest NA 68
## 2 classif.randomForest NA 126
## 3 classif.randomForest NA 423
## 4 classif.randomForest NA 409
## 5 classif.randomForest NA 25
## 6 classif.randomForest NA 59
## mmce.test.mean dob eol error.message exec.time
## 1 0.03333333 1 NA <NA> 0.024
## 2 0.04000000 1 NA <NA> 0.024
## 3 0.03333333 1 NA <NA> 0.044
## 4 0.04000000 1 NA <NA> 0.037
## 5 0.04000000 1 NA <NA> 0.018
## 6 0.03333333 1 NA <NA> 0.020During tuning you might want to optimize multiple, potentially conflicting, performance measures simultaneously.
In the following example we aim to minimize both, the false positive and the false negative rates (fpr and fnr). We again tune the hyperparameters of an SVM (function kernlab::ksvm()) with a radial basis kernel and use sonar.task() for illustration. As search strategy we choose a random search.
For all available multi-criteria tuning algorithms see TuneMultiCritControl().
ps = makeParamSet(
makeNumericParam("C", lower = -12, upper = 12, trafo = function(x) 2^x),
makeNumericParam("sigma", lower = -12, upper = 12, trafo = function(x) 2^x)
)
ctrl = makeTuneMultiCritControlRandom(maxit = 30L)
rdesc = makeResampleDesc("Holdout")
res = tuneParamsMultiCrit("classif.ksvm", task = sonar.task, resampling = rdesc, par.set = ps,
measures = list(fpr, fnr), control = ctrl, show.info = FALSE)
res
## Tune multicrit result:
## Points on front: 2
head(as.data.frame(trafoOptPath(res$opt.path)))
## C sigma fpr.test.mean fnr.test.mean dob eol
## 1 2.029269e+02 4.067472e+00 1.00000000 0.0000000 1 NA
## 2 2.524230e+00 2.562978e+01 1.00000000 0.0000000 2 NA
## 3 3.016595e-02 8.170205e-03 1.00000000 0.0000000 3 NA
## 4 2.310902e+03 4.401674e-04 0.08571429 0.3142857 4 NA
## 5 2.429059e-01 1.811151e+02 1.00000000 0.0000000 5 NA
## 6 1.003927e+01 3.545157e-01 0.91428571 0.0000000 6 NA
## error.message exec.time
## 1 <NA> 0.027
## 2 <NA> 0.021
## 3 <NA> 0.020
## 4 <NA> 0.020
## 5 <NA> 0.020
## 6 <NA> 0.027The results can be visualized with function plotTuneMultiCritResult(). The plot shows the false positive and false negative rates for all parameter settings evaluated during tuning. Points on the Pareto front are slightly increased.
