【发布时间】:2014-07-30 04:53:48
【问题描述】:
我正在尝试使用 L1 惩罚来拟合回归模型,但我无法在 python 中找到适合合理时间的实现。我得到的数据大约是 100k x 500(旁注;其中几个变量非常相关),但是在此上运行 sklearn Lasso 实现需要 12 个小时以上才能拟合单个模型(我实际上不是确定确切的时间,我已经让它通宵运行了好几次,它从未完成)。
我一直在研究 Stochastic Gradient Descent,以作为更快完成工作的一种方式。但是,当我使用 1e5 次迭代时,sklearn 中的 SGDRegressor 实现需要大约 8 小时才能适应。这似乎是一个相对较小的数量(文档甚至建议该模型通常需要大约 1e6 次迭代才能收敛)。
我想知道是否有什么我很愚蠢的事情导致发作需要很长时间。有人告诉我,SGD 经常用于提高效率(大约 O(n_iter * n_samp * n_feat),但到目前为止我还没有看到与 Lasso 相比有多大改进。
为了加快速度,我试过了:
- 减小 n_iter,但这通常会导致非常糟糕的解决方案,因为它尚未收敛。
- 增加步长(并减少 n_iter),但这通常会使损失函数爆炸
- 更改学习率类型(从反向缩放到基于迭代次数的量),这似乎也没有太大的区别。
对于加快这个过程有什么建议吗?似乎 partial_fit 可能是答案的一部分,尽管这方面的文档有些稀疏。我希望能够在不等待三天的情况下安装这些模型。
【问题讨论】:
-
微软研究院在Stochastic Gradient Descent Tricks 上有一篇有趣的论文可能会有所帮助
-
嗯,很有用。我还查看了 sklearn SGD 代码,看起来实际上每次迭代都会通过整个数据集,所以实际上收敛速度比我想象的要快得多。
-
Partial_fit 不是答案。它不会加快任何速度。如果有的话,它会使它变慢。实现非常有效,我很惊讶你说收敛速度很慢。您运行了多少次迭代,目标是什么样的?通常调整初始学习率可以提高速度。你的数据集真的不应该是一个问题。您可以尝试 vopal wabbit,这是一个更快的实现,但应该没有必要。
标签: python machine-learning scikit-learn linear-regression