【问题标题】:Train SVM on a very large dataset stored on hard drive在存储在硬盘上的非常大的数据集上训练 SVM
【发布时间】:2015-12-11 19:59:28
【问题描述】:

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

【问题讨论】:

  • 看看ff
  • @tguzella ff 包在这里没有帮助。
  • @Slater Tyranus 为什么不呢?
  • @tguzella 因为问题不仅仅是加载文件,而是在 SVM 中使用它。如果只是访问文件ff 会很好,但它不适合在离线算法中进一步使用。
  • @Saeed 这是回归问题还是分类问题?如果分类,有多少类?

标签: r machine-learning bigdata svm libsvm


【解决方案1】:

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

  • 在线:支持一次输入一个示例,每个示例都对模型略有改进
  • 离线:支持一次性输入整个数据集,比在线模型精度更高

许多典型算法既有在线实现也有离线实现,但 SVM 不是其中之一。据我所知,SVM 传统上是一种仅离线的算法。其原因是围绕“粉碎”数据集的许多细节。我不会在这里过多地讨论数学,但如果你仔细阅读它应该会很明显。

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

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

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

【讨论】:

  • 嗯,他明确提到他想应用线性 SVM,其训练复杂度较低。例如,请参阅 Joachims 在 KDD 2006 中的经典论文 (cs.cornell.edu/people/tj/publications/joachims_06a.pdf)
  • @Slater Tyranus 谢谢你的有用笔记。我刚看到这篇论文:(csie.ntu.edu.tw/~cjlin/papers/kdd_disk_decomposition.pdf) 你怎么看这篇论文?请让我知道你在这张纸上的 cmets。谢谢
  • @tguzella 我错过了,谢谢提及。也就是说,尽管有 Joachim 的论文,但大多数线性 SVM 实现仍然是 n^2。如果从头开始构建,则可以解决该问题。
  • @Saeed 如果您想从头开始实施,那篇论文确实可以提供帮助,但它看起来像是一项艰巨的任务。
【解决方案2】:

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

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

至于您的内存问题,如果您需要整个数据集,那会有点令人惊讶 - 我希望您能够很好地阅读数据样本,然后在此基础上训练您的模型。为了确认这一点,您可以在不同的样本上训练多个模型,然后在相同的保持集上估计性能 - 不同模型的性能应该相似。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2015-08-14
      • 2019-06-28
      • 1970-01-01
      • 2019-06-19
      • 2015-08-14
      • 1970-01-01
      • 2014-05-18
      • 2016-10-02
      • 2018-01-20
      相关资源
      最近更新 更多