存在一个非常大的自己收集的大小为 [2000000 12672] 的数据集,其中的行显示实例数和列数,即要素数。此数据集在本地硬盘上占用 ~60 Gigabyte 。我想在此数据集上训练线性SVM。问题是我只有 8 GB的RAM!所以我无法加载所有数据一次。有没有解决方案来训练这个大型数据集上的SVM?生成数据集是我自己的愿望,目前是HDF5格式。 感谢
答案 0 :(得分:3)
欢迎来到机器学习!在这个领域工作的一个难点是计算要求。有两种主要的算法,在线和离线。
许多典型的算法都有在线和离线实现,但SVM不是其中之一。据我所知,SVM传统上只是一种离线算法。其原因很多就是围绕着#34;粉碎"数据集。我在这里不太擅长数学,但是如果你读到它就应该变得明显了。
值得注意的是,SVM的复杂性介于n^2
和n^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它训练分段数据,甚至可以预先加载(称为异步)以加速慢速硬盘的读取。