我试图用L1惩罚拟合一个回归模型,但是我很难在合理的时间内找到一个适合的python实现。我得到的数据大约是100k × 500(旁注;几个变量是相当相关的),但是运行sklearn Lasso实现需要12个小时以上来拟合一个模型(我实际上不确定确切的时间,我已经让它运行了好几次,它从来没有完成)。
我一直在研究随机梯度下降作为一种更快完成工作的方法。然而,当我使用1e5次迭代时,sklearn中的SGDRegressor实现需要8小时才能适应。这似乎是一个相对较小的量(文档甚至建议模型通常需要大约1e6升才能收敛)。
我在想是不是我做了什么蠢事,导致痉挛持续了很长时间。我被告知SGD经常被用于它的效率(大约是0 (n_iter * n_samp * n_feat),尽管到目前为止我还没有看到比Lasso有很大的改进。
为了加快速度,我试过:
- 减小n_iter,但这通常导致一个非常糟糕的解决方案,因为它还没有收敛。
- 增加步长(并减少n_iter),但这通常会使损失函数爆炸
- 改变学习率类型(从逆比例到基于迭代次数的数量),这似乎也没有很大的不同。
Partial_fit不是答案。它不会加速任何东西。如果有的话,它会使它变慢。
实现非常有效,我很惊讶你说收敛很慢。我认为你做了很多次迭代。你有没有注意到目标是如何减少的?
通常调整初始学习率可以提高速度。你的数据集应该不是问题。我不确定SGDRegressor是否在内部做到了这一点,但重新缩放目标到单位方差可能会有所帮助。
您可以尝试vopal rabbit,这是一个更快的实现,但它不应该是必需的。