python - 如何加速随机梯度下降?

标签 python machine-learning scikit-learn linear-regression

我正在尝试用 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 有多大改进。

为了加快速度,我尝试过:

  1. 减少 n_iter,但这通常会导致非常糟糕的解决方案,因为它尚未收敛。
  2. 增加步长(并减少 n_iter),但这通常会使损失函数爆炸
  3. 更改学习率类型(从反向缩放到基于迭代次数的量),这似乎也没有产生巨大的差异。

对于加快这一过程有什么建议吗?看起来partial_fit可能是答案的一部分,尽管这方面的文档有点稀疏。我希望能够安装这些模型,而无需等待三天。

最佳答案

Partial_fit 不是答案。它不会加速任何事情。如果有什么不同的话,那就是速度会变慢。

实现非常高效,令我惊讶的是你说收敛速度很慢。我认为你会进行多次迭代。您是否看过目标是如何降低的?

经常调整初始学习率可以提高速度。您的数据集确实不应该成为问题。我不确定 SGDRegressor 是否在内部执行此操作,但将目标重新调整为单位方差可能会有所帮助。

您可以尝试 vopal wabbit,这是一个更快的实现,但这不是必需的。

关于python - 如何加速随机梯度下降?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24123847/

相关文章:

python - 如何使用for循环 append 从python中的函数生成的数据框

python - 报告 scikit-learn 中 DecisionTreeClassifier 的学习树的深度和叶子数量

python - 使用 Python 从法语 Word 文档中提取 XML 时出现问题 : illegal characters generated

python - 在 Linux 操作系统上使用 Python 处理文件

python - TensorFlow:一个网络,两个 GPU?

python - Keras - model.predict_classes 给出了错误的标签

python - cx-freeze 找不到所有依赖项

python - Celery worker 进入无限启动和关闭循环

python - 将 make_column_transformer 与 OnehotEncoder 和 StandaScaler + 直通结合使用

python - 在一个对象中处理标签编码、转换和估计