我正在尝试运行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)
答案 0 :(得分:1)
您可以采取以下措施:
使用主成分分析(PCA)或独立成分分析(ICA)减少数据中的要素数量。您可以使用caret::Preprocess
执行此操作。如果运行随机林并检查要素重要性,还可以删除不重要的功能。
尝试使用随机林的ranger library implementation。在培训通话中设置method = 'ranger'
。我发现游侠通常更快。
答案 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 seconds
和h2o 1.94 seconds
。大数据时执行时间更明显。