比 glmnet 更快的弹性网络正则化回归选项

机器算法验证 r 回归 网络 模型评估 弹性网
2022-04-16 03:51:49

我试图根据旧金山犯罪统计数据 ( https://www.kaggle.com/c/sf-crime ) 从 X 和 Y 坐标预测犯罪类别。事实证明,glmnet 拟合这个数据集的速度非常慢:当我拟合 10 万个观测值的样本时,大约需要 3 分钟。如果我将该时间外推到整个数据集(878k 观察) - 整个拟合将需要大约 25 分钟。

所以,我的问题是

  1. 在 R 中交互式工作的最大数据集大小是多少?
  2. 其他语言(Python、Java)在类似任务上的速度有多快?
  3. 这样的表现是否意味着我根本不应该尝试在 R 中解决如此大的问题而选择其他语言?
2个回答

在@Wayne 对并行化的评论之后,请参阅Zhou 等人。(2014),“减少弹性网络以支持向量机并应用于 GPU 计算”,arXiv:1409.1976他们说

解决弹性网络问题的最先进的单核实现是弗里德曼开发的 glmnet 包。glmnet 主要用 Fortran 语言编写,采用坐标梯度下降策略,并进行了高度优化。据我们所知,它是 Elastic Net 中最快的现成求解器。由于其固有的顺序性,坐标下降算法极难并行化。

但想出一种不同的方法,表明弹性网络等效于一种支持向量机(可以并行化):

[...] 我们从最近关于机器学习缩减的工作中获得灵感 [15, 19],我们将弹性网络缩减为平方铰链损失 SVM(没有偏置项)。我们表明,这种减少在实践中是准确且极其有效的。由此产生的算法,我们称之为支持向量弹性网络 (SVEN),自然地利用了并行 SVM 上的大量现有工作,立即在 GPU、多核 CPU 和分布式系统上提供高效的弹性网络和 Lasso 实现

请注意,通过交叉验证进行的超参数选择当然可以并行化(并针对收缩超参数实现-请参阅在 R 中并行执行 glmnetcv.glmnet

适合支持向量弹性网络的 Matlab 代码可在https://bitbucket.org/mlcircus/sven/获得。你可以试试看!

首先,您有一个好主意,即您可以通过较小的样本来感受事物,从而解决您方法中的问题。正如您所注意到的,这绝对是真的,需要一段时间才能完成的事情确实会分散您的注意力。这很烦人。但...

其次,您必须定义“交互式”。你是指瞬间、1 秒、10 秒还是什么?

第三,您需要考虑您的硬件、您正在使用的软件、您拥有多少数据以及您正在执行什么算法。

例如,lm处理 100K 行数据可能对您来说是“交互式的”。显然glmnet做的不止这些。

就其他语言而言,如果您在执行的代码之外还有很多代码,那么 Python 或 Java 可能会更快glmnet正如其中一条评论所说,glmnet它是用 C 或 Fortran 编码的,并且会尽可能快。如果您正在循环或围绕glmnet.

可以并行化一些算法。我不确定是否glmnet是其中之一。如果您找到一种具有并行化版本的语言——比如使用多核的语言,并且你正在一台具有多核和足够 RAM 的机器上运行——那将会以亚线性方式加速。四核不会快四倍,但应该快 2-3 倍。

所以,答案是“不,可能不是”。你的算法通常会胜过其他任何事情,而且也许glmnet单独不是最好的选择。