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

Posted

技术标签:

【中文标题】提高插入符号 (R) 中的模型训练速度【英文标题】:Improving model training speed in caret (R) 【发布时间】:2015-12-30 04:57:20 【问题描述】:

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

【问题讨论】:

问一个显而易见的问题:您是否可以使用 300K 观测值的一个子集?您可以证明 30K 子集的行为方式与完整的 300K 集相同。 嗨蒂姆,如果我不清楚,对不起。 8 小时用于训练 30k 次观察(10%)。 1% 的训练需要合理的时间,但预测性不强。这是给你的一个问题:我的结果是一个二元因素(“是”/“否”),但“是”只出现在我总数据集的 20% 左右。你认为提供一个更均匀分割的测试集(比如 50/50 'Yes'/'No')可以让我在更小的样本量上进行训练吗? 在 30k x 20 上真的有那么慢吗?这真的很令人惊讶。您正在使用多少 RAM? 我认为你不应该在统计上改变你的输入数据集。如果您不能采用比您拥有的更小的子集,我会感到惊讶。话虽这么说,300K 的观测值在宏伟的计划中并没有那么大。 我同意,300K 并没有那么大,这就是让性能如此令人沮丧的原因。 【参考方案1】:

@phiver 一针见血,但对于这种情况,有几点建议:

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

最大

【讨论】:

【参考方案2】:

在比较底层模型和使用 caret 时,人们忘记了 caret 有很多额外的东西。

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

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

我的建议是开始缩小以查看是否可以加快速度,例如将引导编号设置为 1 并将长度调整回默认值 3。甚至将 traincontrol 方法设置为“无”,只是为了获得一个关于模型在最小设置和无重采样下的速度的想法。

【讨论】:

与其他方法相比,插入符号有哪些“额外”功能? Caret 进行超参数搜索。它搜索调整参数以找到最佳组合。【参考方案3】:

@phiver 和 @topepo 的出色输入。我将尝试总结并添加一些从我为类似问题所做的一些 SO 帖子搜索中收集的更多观点:

是的,并行处理需要更多时间,而内存更少。使用 8 个内核和 64GB RAM,根据经验,最多可以使用 5-6 个工作人员。 @topepo 的插入符号预处理页面here 非常棒。它具有循序渐进的指导性,有助于替代虚拟变量、去除多重共线/线性组合变量和变换等人工预处理工作。 randomForest 和其他模型变得非常缓慢的原因之一是分类变量中的因子数量。如果可能,建议使用俱乐部因子或转换为序数/数字转换。 尝试使用插入符号中的 Tunegrid 功能,以充分利用集成模型。从数据样本的 mtry/ntree 的最小值开始,看看它在提高准确性方面的效果如何。 我发现this SO 页面在主要建议使用 parRF 时非常有用。通过用 parRF 替换 RF,我的数据集并没有太大的改进,但你可以试试。其他建议是使用 data.table 而不是数据框,并使用预测/响应数据而不是公式。相信我,它极大地提高了速度(但有一个警告,预测器/响应数据的性能(提供 x=X,y=Y data.tables)似乎也以某种方式提高了预测准确性,并将变量重要性表从使用公式 (Y~.) 时按因子分解。

【讨论】:

以上是关于提高插入符号 (R) 中的模型训练速度的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用插入符号训练模型的时机

在 R 的插入符号训练函数中使用“ROC”度量的问题

R 插入符号保留样本和测试集 ROC

按组在插入符号中训练时间序列模型

R - Caret - 在模型训练中使用 ROC 而不是准确性

深度学习基础知识 - 21加快深度学习模型训练速度的方法