Вот пример распараллеливания функции gafs()
с использованием пакета doParallel
и изменения нескольких других параметров, чтобы сделать его быстрее.Где возможно я включаю время выполнения.
В исходном коде используется перекрестная проверка (method = "cv"
), а не повторная перекрестная проверка (method = "repeatedcv"
), поэтому я считаю, что параметр repeats = 2
игнорируется.Я не включил эту опцию в распараллеленном примере.
Сначала , используя исходный код без каких-либо изменений или распараллеливания:
> library(caret)
> data(iris)
> set.seed(1)
> st.01 <- system.time(results.01 <- gafs(iris[,1:4], iris[,5],
iters = 2,
method = "xgbTree",
metric = "Accuracy",
gafsControl = gafsControl(functions = caretGA,
method = "cv",
repeats = 2,
verbose = TRUE),
trConrol = trainControl(method = "cv",
classProbs = TRUE,
verboseIter = TRUE)))
Fold01 1 0.9596575 (1)
Fold01 2 0.9596575->0.9667641 (1->1, 100.0%) *
Fold02 1 0.9598146 (1)
Fold02 2 0.9598146->0.9641482 (1->1, 100.0%) *
Fold03 1 0.9502661 (1)
Я запустил вышеуказанный кодв течение ночи (от 8 до 10 часов), но остановил его, потому что это заняло слишком много времени, чтобы закончить.Очень приблизительная оценка времени выполнения может составлять не менее 24 часов.
Секунда , включая сокращенные параметры popSize
(с 50 до 20), allowParallel
и genParallel
дляgafsControl()
и, наконец, number
сгибов (с 10 до 5) в gafsControl()
и trControl()
:
> library(doParallel)
> cl <- makePSOCKcluster(detectCores() - 1)
> registerDoParallel(cl)
> set.seed(1)
> st.09 <- system.time(results.09 <- gafs(iris[,1:4], iris[,5],
iters = 2,
popSize = 20,
method = "xgbTree",
metric = "Accuracy",
gafsControl = gafsControl(functions = caretGA,
method = "cv",
number = 5,
verbose = TRUE,
allowParallel = TRUE,
genParallel = TRUE),
trConrol = trainControl(method = "cv",
number = 5,
classProbs = TRUE,
verboseIter = TRUE)))
final GA
1 0.9508099 (4)
2 0.9508099->0.9561501 (4->1, 25.0%) *
final model
> st.09
user system elapsed
3.536 0.173 4152.988
Моя система имеет 4 ядра, но, как указано, она использует только 3,и я проверил, что он запускает 3 процесса R.
Документация gafsControl()
описывает allowParallel
и genParallel
примерно так:
allowParallel
: еслизагружен и доступен параллельный бэкэнд, должна ли функция использовать его?
genParallel
: если параллельный бэкэнд загружен и доступен, должны ли 'gafs' использовать его для параллелизации вычислений пригодностив поколении внутри повторной выборки?
Документация каретки предлагает, что опция allowParallel
даст большее улучшение времени выполнения, чем опции genParallel
: https://topepo.github.io/caret/feature-selection-using-genetic-algorithms.html
Я бы ожидал, по крайней мере, немного отличающиеся результаты от распараллеленного кода по сравнению с тон оригинальный код.Вот результаты из распараллеленного кода:
> results.09
Genetic Algorithm Feature Selection
150 samples
4 predictors
3 classes: 'setosa', 'versicolor', 'virginica'
Maximum generations: 2
Population per generation: 20
Crossover probability: 0.8
Mutation probability: 0.1
Elitism: 0
Internal performance values: Accuracy, Kappa
Subset selection driven to maximize internal Accuracy
External performance values: Accuracy, Kappa
Best iteration chose by maximizing external Accuracy
External resampling method: Cross-Validated (5 fold)
During resampling:
* the top 4 selected variables (out of a possible 4):
Petal.Width (80%), Petal.Length (40%), Sepal.Length (20%), Sepal.Width (20%)
* on average, 1.6 variables were selected (min = 1, max = 4)
In the final search using the entire training set:
* 4 features selected at iteration 1 including:
Sepal.Length, Sepal.Width, Petal.Length, Petal.Width
* external performance at this iteration is
Accuracy Kappa
0.9467 0.9200