我正在尝试通过使用插入符号的遗传算法进行特征选择来优化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
,这也更合适。我该怎么做才能使速度更快?
答案 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),将allowParallel
和genParallel
选项减少到gafsControl()
,最后减少{{ number
和gafsControl()
中的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