Ускорьте выбор генетических функций кареты - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь оптимизировать дерево xgboost с помощью выбора функций с помощью генетического алгоритма карета

results <- 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)
               )

это, однако, очень медленно, и это даже при том, что я просто использую iters = 2 вместо iters = 200, что было бы более подходящим. Что я могу сделать, чтобы сделать это быстрее?

1 Ответ

0 голосов
/ 21 января 2019

Вот пример распараллеливания функции 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...