在存储在硬盘驱动器上的非常大的数据集上训练SVM

时间:2015-09-15 14:03:14

标签: r machine-learning bigdata svm libsvm

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

3 个答案:

答案 0 :(得分:3)

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

  • 在线:支持一次一个地提供示例,每个都略微改进模型
  • 离线:支持一次输入整个数据集,实现比在线模型更高的准确性

许多典型的算法都有在线和离线实现,但SVM不是其中之一。据我所知,SVM传统上只是一种离线算法。其原因很多就是围绕着#34;粉碎"数据集。我在这里不太擅长数学,但是如果你读到它就应该变得明显了。

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

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

正如评论中所提到的那样,out-of-core算法的概念也可以直接对存储在磁盘上的对象进行操作。我所知道的唯一一组提供核心外算法的人是dato。它是商业产品,但可能是您最好的解决方案。

答案 1 :(得分:2)

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

请注意,RSofia比R中可用的其他SVM软件包更加简单;例如,您需要进行自己的中心和功能扩展。

关于你的记忆问题,如果你需要整个数据集,那就有点令人惊讶了 - 我希望你能在你的数据样本中读得很好,然后在你的数据上训练你的模型。为了证实这一点,您可以在不同的样本上训练多个模型,然后在相同的保持集上估计性能 - 不同模型的性能应该相似。

答案 2 :(得分:0)

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