为什么caret :: predict()仅使用XGBtree进行并行处理?

时间:2017-09-11 10:19:26

标签: r r-caret

我理解为什么在训练期间只能为XGB使用并行处理,并且不能用于其他模型。然而,令人惊讶的是我注意到xgb的预测也使用了并行处理。

当我将大型10M +数据框拆分成预测使用foreach %do%时,我意外地注意到了这一点。这导致了一些错误,所以试图绕过它们我切换到使用caret::train()的顺序循环,但在终端中注意到所有正在使用的处理器。

经过一些试验和错误后,我发现caret::predict()似乎使用并行处理,其中模型仅为XGB树(可能是其他模型),但不在其他模型上。

当然可以预测可以与任何模型并行完成,而不仅仅是xgb?

使用所有可用处理器是library(tidyverse) library(caret) library(foreach) # expected to see parallel here because caret and xgb with train() xgbFit <- train(Species ~ ., data = iris, method = "xgbTree", trControl = trainControl(method = "cv", classProbs = TRUE)) iris_big <- do.call(rbind, replicate(1000, iris, simplify = F)) nr <- nrow(iris_big) n <- 1000 # loop over in chunks of 20 pieces <- split(iris_big, rep(1:ceiling(nr/n), each=n, length.out=nr)) lenp <- length(pieces) # did not expect to see parallel processing take place when running the block below predictions <- foreach(i = seq_len(lenp)) %do% { # %do% is a sequential loop # get prediction preds <- pieces[[i]] %>% mutate(xgb_prediction = predict(xgbFit, newdata = .)) return(preds) } 的默认行为还是预期行为,是否可以通过以下方式控制此问题:打开或关闭它?

可重复的例子:

method = "xgbTree"

如果您将base R更改为例如method =“knn”然后尝试再次运行循环,只使用一个处理器。

因此,预测似乎根据模型的类型自动使用并行处理。

这是对的吗? 它可以控制吗?

enter image description here

1 个答案:

答案 0 :(得分:1)

在本期中,您可以找到所需的信息:

https://github.com/dmlc/xgboost/issues/1345

总之,如果您使用并行性训练模型,预测方法也将以并行处理方式运行。 如果要更改后一种行为,则必须更改设置:

xgb.parameters(bst) <- list(nthread = 1)

另一种方法是更改​​环境变量:

OMP_NUM_THREADS

正如你解释的那样,这只发生在xgbTree