R - 提高插入符号::训练功能的性能

时间:2018-01-05 02:30:33

标签: r machine-learning parallel-processing

我正在尝试运行train()包中的caret函数。但是,运行所花费的时间令人望而却步。我已经尝试通过在多个内核上运行来提高速度,但即便如此......它仍在加载。还有其他方法可以加快像这样的机器学习过程吗?

library(parallel)
library(doParallel)
library(caret)
library(mlbench)
library(caret)

data(Sonar)

inTraining <- createDataPartition(Sonar$Class, p = .75, list=FALSE)
training <- Sonar[inTraining,]
testing <- Sonar[-inTraining,]

cluster <- makeCluster(detectCores() - 1)
registerDoParallel(cluster)

trControl <- trainControl(method = "cv", number = 5, allowParallel = T)
system.time(fit <- train(x,y, method="rf",data=Sonar,trControl = trControl))

stopCluster(cluster)

2 个答案:

答案 0 :(得分:1)

您可以采取以下措施:

  1. 使用主成分分析(PCA)或独立成分分析(ICA)减少数据中的要素数量。您可以使用caret::Preprocess执行此操作。如果运行随机林并检查要素重要性,还可以删除不重要的功能。

  2. 尝试使用随机林的ranger library implementation。在培训通话中设置method = 'ranger'。我发现游侠通常更快。

  3. 减少cross validation步骤的数量。这减少了数据的分割数量,有效地减少了训练迭代次数。

答案 1 :(得分:1)

很多时候我使用插入符号,但它似乎很慢,现在我使用h2o包,它非常快。我建议阅读此article,看看为什么我的决定。现在使用Sonar基础,生成此代码。

# Starts H2O using localhost IP, port 54321, all CPUs,and 6g of memory 
data(Sonar,package = "mlbench")
library(h2o)
h2o.init(ip = "localhost", port = 54321, nthreads= -1,max_mem_size = "6g")
Sonar.split = h2o.splitFrame(data = as.h2o(Sonar),ratios = 0.75)
Sonar.train = Sonar.split[[1]]
Sonar.test  = Sonar.split[[2]]

#hyper_params <- list(mtries = c(2,5,10), ntrees = c(100,250,500), max_depth = c(5,7,9))
hyper_params <- list(mtries = c(2,5,10))
system.time(grid <- h2o.grid(x = 1:60, y = 61, training_frame = Sonar.train, validation_frame = Sonar.test,
                 algorithm = "drf", grid_id = "covtype_grid", hyper_params = hyper_params,
                 search_criteria = list(strategy = "Cartesian"), seed = 1234))

# Sort the grid models by logloss
sortedGrid <- h2o.getGrid("covtype_grid", sort_by = "logloss", decreasing = FALSE)
sortedGrid

l对于带插入符号和h2o的算法,使用syste.time函数,结果如下:caret 20.81 secondsh2o 1.94 seconds。大数据时执行时间更明显。