【问题标题】:How to speed up logistic regression computation on large data sets in R如何加快 R 中大型数据集的逻辑回归计算
【发布时间】:2014-11-13 09:25:03
【问题描述】:

全部,

我正在开发一个并行计算大量逻辑回归的应用程序。我在带有 16 GB RAM 的 mac mini 上运行 8 核 Intel i7 处理器,但即使有这些体面的系统规格,我发现在大于 ~100MB 的数据集上计算时间非常缓慢。一个复合因素是我对算法进行了编程,以完全交互训练框架中的所有分类变量和连续变量,因此 1,000,000 x 8 矩阵可以很容易地扩展为 1,000,000 x 32 矩阵。

在 R 中,到目前为止,我已经尝试使用 method = "L-BFGS-B" 对传递给 optim 的目标函数和损失函数进行编码,但在我所有的速度测试中,即使使用普通的 glm 实现,这也基本上被打破了。

我知道 Python 有一些非常好的逻辑回归工具,并且很好地支持 R -> Python、Python -> R 集成。目前这是我的首选,尽管我还没有测试 Python 在逻辑回归中比 R 快多少。

我考虑过的其他事情是尝试将 R 与 Julia 或 F# 联系起来,但编写好的 API 以允许这些语言相互交流超出了我的技能水平。

最后,我检查了使用 Dirk Eddelbuettel 的 Rcpp 包和 lbfgs 包来优化我在 C++ 中的系数。除了不了解 C++(目前)之外,我还需要一个脚本来动态重写 C++ 后端,使其与训练数据帧的尺寸和每次迭代时传递给它的参数集的长度相匹配。数据维度在我的算法中是动态的,我需要一个适应这种情况的优化程序。

程序的工作流程,目前全部包含在R中,如下:

(1) 导入数据

(2) 重新格式化数据

(3) 对数据应用逻辑回归包装器

(4) 使用输出预测新数据

我不是用一种新语言重写整个东西,而是寻找一种方法来提高 (3) 的效率。我现在受到 CPU 的限制,而不是内存。

总结一下:

  • 什么是对逻辑回归模型进行快速、高效内存计算的最佳工具?和
  • 是否可以将这些工具中的任何一个平滑地集成到 R 脚本文件中?
  • Python 的逻辑回归功能比 R 的效率高多少?

谢谢,

亚伦

【问题讨论】:

  • 如果对您的应用程序有意义,您可能应该(=几乎肯定)使用带有稀疏模型矩阵的迭代重加权最小二乘法,而不是通用优化。首先检查glm.fit 并(1)去除你不需要的任何东西,(2)使其适应稀疏矩阵。还可以查看RcppEigen 包中的fastLm
  • 现在检查这些并进行一些比较,谢谢,Ben。
  • @BenBolker:你玩过biglm 包吗?看起来它的内存效率很高——我想知道它也很快。在阅读了 glm.fit 的文档后,“拟合函数”部分似乎建议可以将“glm.fit”换成命名空间中的另一个优化函数。这是你的理解吗?有没有我可以使用迭代重新加权最小二乘的函数?
  • biglm 可能比完全在内存中工作。它本质上并不慢,但它的主要优点是它能够在内存不足的情况下工作。

标签: r logistic-regression


【解决方案1】:

您是否尝试过考虑您对内存管理单元和进程调度程序所做的事情?

1) 如果可能,将其分块并忘记并行运行一百万个线程。只是不要这样做。 2)如果你不能,找到一个更轻的线程实现并使用第三方库来做。 3) 更改调度程序抢先从线程切换到线程的次数。要么: 关闭抢先式调度(Turn of interrupts)并自行管理线程。

【讨论】:

  • 感谢您的参与。为了确保我理解您,您是说我应该或不应该并行运行这项工作?我不完全理解你的回答。
  • 我的意思是,如果您在内存中运行大量并行进程,您的操作系统会尝试让它们在一段时间内以均等分布运行。如果您在 GPU 上并且有大量内核可以并行化,那很好,但如果您使用最多 4 个内核,则并行化只是虚拟的,并且您需要对线程进行大量上下文切换。如果每个线程与您的缓存大小相比还相当大,那么您的系统会从算法中消耗大量功率,因为​​它需要一直来回移动数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多