【问题标题】:How to speed up GLM estimation?如何加快 GLM 估计?
【发布时间】:2013-04-23 11:31:54
【问题描述】:

我在 Amazon EC2 上使用 RStudio 0.97.320 (R 2.15.3)。我的数据框有 200k 行和 12 列。

我正在尝试使用大约 1500 个参数来拟合逻辑回归。

R 使用 7% 的 CPU 并拥有 60+GB 的内存,并且仍然需要很长时间。

代码如下:

glm.1.2 <- glm(formula = Y ~ factor(X1) * log(X2) * (X3 + X4 * (X5 + I(X5^2)) * (X8 + I(X8^2)) + ((X6 + I(X6^2)) * factor(X7))), 
  family = binomial(logit), data = df[1:150000,])

有什么建议可以显着加快速度吗?

【问题讨论】:

  • 我没有关于速度的直接建议,但就推断而言,您不应该使用var+I(var^2)。相反,您应该使用poly(var,2)。你已经构建了一个非常复杂的公式,你需要这样一个怪物根本不清楚。您应该描述研究问题并获得有关分析设计的进一步建议,并且您可能应该在 CrossValidated 上这样做。
  • 我怀疑拟合 1500 个参数会产生有用的结果。
  • 有趣的技术问题,虽然我同意其他评论者的担忧。 (1) RcppArmadillo 包中有一个 fastLm 函数,说明了如何加速线性回归 gallery.rcpp.org/articles/fast-linear-model-with-armadillo ,但重新实现 GLM 会更有效。 (2) 安装优化的 BLAS 库可能是容易实现的目标:r-bloggers.com/faster-r-through-better-blas。 (3) 线性回归可能工作正常,尽管在这种情况下 N/P 仅为 133。 (4)通过glmnet包尝试惩罚GLM ...
  • (5) 因为你的一些预测变量是因子,你可以通过使用稀疏模型矩阵来获得一些速度(参见Matrix 包中的?glm.fit?sparse.model.matrix)——尤其是如果你的因素有很多层次。
  • 你应该认真考虑使用glmnet,它真的很快(它使用梯度下降)并且有 1500 个参数可以适应我不认为正则化(通过弹性网络)会受到伤害......跨度>

标签: performance r bigdata


【解决方案1】:

有几个包可以加快glm 的安装速度。 fastglm 的基准测试表明它比 speedglm 更快。

您还可以在您的计算机上安装性能更高的 BLAS 库(正如 Ben Bolker 在 cmets 中建议的那样),这将有助于任何方法。

【讨论】:

  • 我可以逐步使用 speedglm 吗?
  • 不要逐步使用。请改用套索。
【解决方案2】:

虽然有点晚了,但我只能鼓励 dickoa 的建议,即使用 Matrix 包生成稀疏模型矩阵,然后将其提供给 speedglm.wfit 函数。效果很好 ;-) 这样,我能够在不到 3 分钟的时间内对 1e6 x 3500 模型矩阵运行逻辑回归。

【讨论】:

    【解决方案3】:

    假设你的设计矩阵不是稀疏的,那么你也可以考虑我的包parglm。有关计算时间的比较和更多详细信息,请参阅this vignette。我在这里比较了计算时间on a related question

    parglm 函数中的一个方法作为mgcv 中的bam 函数工作。该方法在

    中有详细描述

    Wood, S.N., Goude, Y. & Shaw S. (2015) 大型数据集的广义加法模型。皇家统计学会杂志,C 系列 64(1): 139-155。

    该方法的优点是可以使用非并发 QR 实现来实现它,并且仍然可以并行进行计算。另一个优点是潜在的较低内存占用。这在mgcvbam 函数中使用,也可以在此处通过speedglmshglm 函数中的设置实现。

    【讨论】:

    • 您能否添加一点关于parglm 所做的事情的上下文(即它如何实现计算效率)?
    • 我已经完成了 mgcv 中的 bam 函数,首先估计了不同数据块上的一系列 QR 分解。然后在最后合并结果。更多细节可以在“Wood, SN, Goude, Y. & Shaw S. (2015) Generalizedadditive models for large datasets. Journal of the Royal Statistical Society, Series C 64(1): 139-155”。
    • 太好了。您能否将此解释编辑到您的问题中(cmets 是短暂的)?
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2013-09-03
    • 2017-04-22
    • 2015-12-12
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多