使插入符号的通用特征选择更快

时间:2019-01-18 14:14:19

标签: r genetic-algorithm r-caret

我正在尝试通过使用插入符号的遗传算法进行特征选择来优化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 :(得分:2)

这里是一个使用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),将allowParallelgenParallel选项减少到gafsControl(),最后减少{{ numbergafsControl()中的1折(从10到5):

trControl()

我的系统有4个内核,但按照指定,它仅使用3个内核,并且我验证了它正在运行3个R进程。

> 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 文档对gafsControl()allowParallel的描述如下:

  • genParallel:如果并行后端已加载并可用, 该函数应该使用它吗?

  • allowParallel:如果并行后端已加载并可用,则应          'gafs'使用它tp并行化内部的适应度计算          重采样中的一代?

插入符号文档建议genParallel选项将比allowParallel选项带来更大的运行时改进: https://topepo.github.io/caret/feature-selection-using-genetic-algorithms.html

与原始代码相比,我期望并行化代码的结果至少略有不同。这是并行化代码的结果:

genParallel