在硬盘上存储的大型数据集上训练支持向量机(SVM)模型

5

我有一个非常大的数据集,大小为[2000000 12672],其中行代表实例数,列代表特征数。这个数据集在本地硬盘上占用约60 GB的空间。我想训练一个线性SVM来处理这个数据集。问题是我只有8 GB的RAM,所以不能一次性加载所有的数据。是否有任何解决方案可以让我在这个大型数据集上进行SVM训练?生成该数据集是我自己的意愿,并且目前是HDF5格式。


请查看 ff 包。 - tguzella
1
@tguzella 这里 ff 包并没有帮助。 - Slater Victoroff
@Slater Tyranus 为什么不呢? - tguzella
1
@tguzella 因为问题不仅仅是加载文件,而是在SVM中使用它。如果只是访问文件,则ff就可以了,但它不适用于离线算法的进一步使用。 - Slater Victoroff
@Saeed 这是一个回归问题还是分类问题?如果是分类问题,有多少个类别? - tguzella
如果您可以使用Python,那么应该使用类似SGDClassifier/regressor的东西。它有partial_fit方法,您可以使用它来拟合模型而无需加载整个数据集。您只需要按块加载数据集并将其馈送到此partial_fit方法即可。据我所知,Pandas库可以加载HDF5。我认为这不是Python中的真正问题 :) - Ibraim Ganiev
3个回答

3
欢迎来到机器学习!在这个领域工作的困难之一是计算要求。有两种主要的算法,即在线和离线。
  • 在线:支持逐个输入示例,每次改进模型
  • 离线:支持一次性输入整个数据集,比在线模型实现更高的准确性
许多典型的算法都有在线和离线实现,但SVM不是其中之一。据我所知,SVM通常是一种仅限离线的算法。原因在于“粉碎”数据集的许多细节。我不会在这里过多地解释数学问题,但如果您了解它,应该就能明白了。
另外值得注意的是,SVM的复杂度介于n^2和n^3之间,这意味着即使您可以加载所有内容到内存中,训练模型也需要很长时间。在移动到完整数据集之前,测试更小部分数据集是非常典型的。
当转移到完整数据集时,您需要在比自己更大的计算机上运行此程序,但AWS应该有足够大的计算机可以使用,尽管在您的数据规模下,我强烈建议使用除SVM之外的其他方法。在大型数据大小下,神经网络方法真正发挥作用,并且可以在更现实的时间内进行训练。
正如评论中所暗示的那样,还有一个概念是可以直接在存储在磁盘上的对象上运行的out-of-core算法。我所知道唯一提供良好out-of-core算法的公司是dato。这是一款商业产品,但可能是您最好的解决方案。

他明确提到要应用线性SVM,其训练复杂度较低。例如,请参阅Joachims在KDD 2006年经典论文(http://www.cs.cornell.edu/people/tj/publications/joachims_06a.pdf)。 - tguzella
@Slater Tyranus感谢您的有用笔记。我刚刚看到了这篇论文:(http://www.csie.ntu.edu.tw/~cjlin/papers/kdd_disk_decomposition.pdf)您对这篇论文有什么看法?请让我知道您对这篇论文的评论。谢谢。 - Saeed
@tguzella,我错过了那个,谢谢你提醒。话虽如此,尽管Joachim的论文,大多数线性SVM实现仍然是n^2。如果从头开始构建,这个问题可以得到解决。 - Slater Victoroff
@Saeed 如果你想从头开始实现这篇论文,它确实可以帮助你,但看起来是一个相当大的工作。 - Slater Victoroff

2
一种随机梯度下降方法可以帮助解决SVM的问题,因为它具有良好的可扩展性并避免了n^2问题。在R中提供了一个名为RSofia的实现,由Google团队创建,并在Large Scale Learning to Rank中进行了讨论。在论文中,他们表明与传统SVM相比,SGD方法显著减少了训练时间(这是由于1、成对学习方法和2、只有一部分观察结果被用来训练模型)。
请注意,RSofia比R中提供的其他SVM软件包更加简化;例如,您需要自行完成特征的居中和缩放。
至于您的内存问题,如果您需要整个数据集,那将会有些令人惊讶 - 我预计您可以读取数据的样本,然后在其上训练模型。为了确认这一点,您可以在不同样本上训练多个模型,然后在同一保留集上估算性能 - 不同模型的性能应该相似。

1

您没有说明为什么需要线性支持向量机,但如果可以考虑另一个通常提供更优结果的模型,则可以查看hpelm python包。它可以直接读取HDF5文件。您可以在此找到https://pypi.python.org/pypi/hpelm。它可以对分段数据进行训练,甚至可以预加载(称为异步)以加速从慢硬盘中读取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接