在存储在硬盘上的超大数据集上训练 SVM

Train SVM on a very large dataset stored on hard drive

存在一个非常大的自己收集的数据集,大小为 [2000000 12672],其中行显示实例数,列显示特征数。本数据集占用本地硬盘~60GB。我想在此数据集上训练线性 SVM。问题是我只有 8 GB 的 RAM! 所以我无法一次加载所有数据。有什么解决方案可以在这个大数据集上训练 SVM 吗?生成数据集是我自己的愿望,目前是 HDF5 格式。 谢谢

欢迎使用机器学习!在 space 中工作的困难之一是计算要求。算法主要有在线和离线两种。

  • 在线:支持一次一个地输入示例,每个示例都对模型进行小幅改进
  • 离线:支持一次性输入整个数据集,精度高于在线模型

许多典型的算法都有在线和离线实现,但 SVM 不是其中之一。据我所知,SVM 传统上只是一种离线算法。原因是 "shattering" 数据集周围有很多细节。我不会在这里深入探讨数学,但如果你仔细阅读它,它就会变得显而易见。

还值得注意的是,SVM 的复杂度介于 n^2n^3 之间,这意味着即使您可以将所有内容加载到内存中,实际训练模型也需要很长时间。在移动到完整数据集之前,使用数据集的一小部分进行测试是非常典型的。

当移动到完整的数据集时,你必须 运行 在比你自己的机器大得多的机器上,但 AWS 应该有足够大的东西供你使用,尽管以你的数据量我强烈建议使用SVM 以外的东西。在大数据量下,神经网络方法非常出色,并且可以在更实际的时间内进行训练。

正如评论中提到的,还有一个 out-of-core 算法的概念,可以直接对存储在磁盘上的对象进行操作。我所知道的唯一提供良好的核外算法的群体是 dato。这是一个商业产品,但可能是您的最佳解决方案。

SVM 的随机梯度下降方法可能会有所帮助,因为它可以很好地扩展并避免 n^2 问题。 R 中可用的实现是 RSofia,它由 Google 的团队创建,并在 Large Scale Learning to Rank 中进行了讨论。在论文中,他们表明与传统的 SVM 相比,SGD 方法显着减少了训练时间(这是由于 1,成对学习方法和 2,最终只有一部分观察结果被用于训练模型) .

请注意,RSofia 比 R 中可用的其他一些 SVM 包更简单;例如,您需要自己对特征进行居中和缩放。

至于你的内存问题,如果你需要整个数据集,那会有点令人惊讶——我希望你能很好地阅读你的数据样本,然后用它来训练你的模型。为了证实这一点,您可以在不同的样本上训练多个模型,然后在同一个 holdout 集上估计性能 - 不同模型的性能应该相似。

您没有说明为什么需要线性 SVM,但如果您可以考虑另一种经常提供出色结果的模型,请查看 hpelm python 包。它可以直接读取HDF5文件。你可以在这里找到它 https://pypi.python.org/pypi/hpelm 它训练分段数据,甚至可以预加载(称为异步)以加快从慢速硬盘读取的速度。