提高插入符号 (R) 中的模型训练速度

Improving model training speed in caret (R)

我有一个包含 20 个特征和大约 300,000 个观察值的数据集。我正在使用插入符来训练具有 doParallel 和四个核心的模型。对于我尝试过的方法(rf、nnet、adabag、svmPoly),即使训练 10% 的数据也需要八个多小时。我正在使用引导程序重新采样 3 次,而我的 tuneLength 是 5。我可以做些什么来加快这个极其缓慢的过程吗?有人建议使用底层库可以将我的过程加快 10 倍,但在我走这条路之前,我想确保没有其他选择。

在比较底层模型与使用插入符号时,人们忘记的是插入符号有很多额外的东西。

以您的随机森林为例。所以 bootstrap、数字 3 和 tuneLength 5。 因此,您重新采样了 3 次,并且由于 tuneLength,您尝试为 mtry 找到一个好的值。您总共 运行 15 个随机森林并比较它们以获得最终模型的最佳模型,而如果您使用基本随机森林模型则只有 1 个。

此外,您 运行 在 4 个核心上并行运行,随机森林需要所有可用的观察结果,因此您所有的训练观察结果将在内存中存储 4 倍。可能没有多少内存可用于训练模型。

我的建议是开始按比例缩小以查看是否可以加快速度,例如将 bootstrap 数字设置为 1 并将长度调整回默认值 3。或者甚至将 traincontrol 方法设置为 "none",只是为了了解模型在最小设置和无重采样情况下的速度。

@phiver 一语中的,但是对于这种情况,有几点建议:

  • 确保使用并行处理不会耗尽系统内存。使用 X worker 时,您正在内存中制作 X 额外的数据副本。
  • class 不平衡,additional sampling 可以提供帮助。下采样可能有助于提高性能并减少时间。
  • 使用不同的库。 ranger instead of randomForest, xgboost or C5.0 instead of gbm。您应该意识到,集成方法正在拟合大量组成模型,并且必然需要一段时间才能拟合。
  • 该软件包有一个 racing-type algorithm 用于在更短的时间内调整参数
  • github上的开发版对调优参数较多的模型采用了随机搜索的方式。

最大

@phiver 和@topepo 的伟大投入。我将尝试总结并添加一些我从搜索类似问题的 SO 帖子中收集到的更多要点:

  • 是的,并行处理需要更多时间,但内存更少。对于 8 核和 64GB 内存,经验法则是最多使用 5-6 名工人。
  • @topepo 关于插入符号 pre-processing here 的页面非常棒。它具有 step-wise 指导意义,有助于取代 pre-processing 的手动工作,例如虚拟变量、删除 multi-collinear / 线性组合变量和转换。
  • 随机森林和其他模型变得非常慢的原因之一是分类变量中的因素数量。如果可能,建议俱乐部因素或转换为ordinal/numeric转换。
  • 尝试将插入符号中的 Tunegrid 功能充分用于集成模型。从数据样本的最小值 mtry/ntree 开始,看看它在提高准确性方面的效果如何。
  • 我发现 this SO 页面在主要建议 parRF 的地方非常有用。通过将 RF 替换为 parRF,我的数据集并没有得到很大改进,但您可以尝试一下。其他建议是使用 data.table 而不是数据帧,并使用 predictor/response 数据而不是公式。它大大提高了速度,相信我(但有一个警告,predictor/response 数据的性能(提供 x=X, y=Y data.tables)似乎也以某种方式提高了预测准确性并改变了factor-wise 中的变量重要性 table 在使用公式 (Y~.) 时分解。