首页 文章

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

提问于
浏览
3

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

3 回答

  • 3

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

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

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

  • 2

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

    • 在线:支持一次一个地提供示例,每个示例略微改进模型

    • 离线:支持一次输入整个数据集,实现比在线模型更高的精度

    许多典型的算法都有在线和离线实现,但SVM不是其中之一 . 据我所知,SVM传统上只是一种离线算法 . 其原因在于围绕“粉碎”数据集的许多细节 . 我不会在这里进行太多的数学计算,但如果你读到它,它应该变得明显 .

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

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

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

  • 0

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

相关问题