我正在尝试用 L1 惩罚来拟合回归模型,但我很难在 python 中找到适合合理时间的实现。我得到的数据约为 100k x 500(旁注;几个变量非常相关),但是运行 sklearn Lasso 实现需要 12 个小时以上才能拟合单个模型(我实际上并没有确定确切的时间,我已经让它运行了好几次,但它从未完成)。
我一直在调查Stochastic Gradient Descent作为更快完成工作的一种方法。然而,SGDRegressor当我使用 1e5 次迭代时,sklearn 中的实现需要大约 8 个小时才能适应。这似乎是一个相对较小的量(文档甚至表明该模型通常需要大约 1e6 次迭代才能收敛)。
我想知道是否有什么我愚蠢的事情导致了痉挛需要很长时间。有人告诉我,SGD 经常因其效率而被使用(大约 O(n_iter * n_samp * n_feat) 左右,尽管到目前为止我还没有看到比 Lasso 有多大改进。
为了加快速度,我尝试过:
- 减少 n_iter,但这通常会导致非常糟糕的解决方案,因为它尚未收敛。
- 增加步长(并减少 n_iter),但这通常会使损失函数爆炸
- 更改学习率类型(从反向缩放到基于迭代次数的量),这似乎也没有产生巨大的差异。
对于加快这一过程有什么建议吗?看起来partial_fit可能是答案的一部分,尽管这方面的文档有点稀疏。我希望能够安装这些模型,而无需等待三天。
最佳答案
Partial_fit 不是答案。它不会加速任何事情。如果有什么不同的话,那就是速度会变慢。
实现非常高效,令我惊讶的是你说收敛速度很慢。我认为你会进行多次迭代。您是否看过目标是如何降低的?
经常调整初始学习率可以提高速度。您的数据集确实不应该成为问题。我不确定 SGDRegressor 是否在内部执行此操作,但将目标重新调整为单位方差可能会有所帮助。
您可以尝试 vopal wabbit,这是一个更快的实现,但这不是必需的。
关于python - 如何加速随机梯度下降?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24123847/