我正在尝试使用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),但这通常会使损失函数爆炸
更改学习速率类型(从反比例缩放到基于迭代次数的数量),这似乎也没有太大的区别。
有什么建议可以加快此过程吗?似乎part_fit可能是答案的一部分,尽管有关此文档的文档很少。我希望能够适合这些型号,而不必等待三天。
最佳答案
Partial_fit不是答案。它不会加快任何速度。如果有的话,它将使其变慢。
该实现非常高效,令您惊讶的是收敛速度很慢,我感到很惊讶。我认为您可以进行多次迭代。您是否看过目标如何降低?
通常,调整初始学习速度可以提高速度。您的数据集确实应该不是问题。我不确定SGDRegressor是否在内部执行此操作,但是将目标调整为单位方差可能会有所帮助。
您可以尝试vopal wabbit,这是一个更快的实现,但不是必须的。
关于python - 如何加快随机梯度下降?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24123847/