探索和应用机器学习算法于无法载入内存的数据集是相当普遍的。
这会导致一些问题,例如:
- 我如何加载我的多个千兆字节的数据文件?
- 当我尝试运行我的数据集时,算法崩溃了,我该怎么办?
- 你能帮我解决内存不足的错误吗?
在这篇文章中,我想提供一些您可能需要考虑的常见建议。

处理机器学习大型数据文件的 7 种方法
照片由 Gareth Thompson 提供,部分权利保留。
1. 分配更多内存
某些机器学习工具或库可能受限于默认内存配置。
检查您是否可以通过重新配置工具或库来分配更多内存。
一个很好的例子是 Weka,您可以在启动应用程序时 通过参数增加内存。
2. 使用更小的样本
您确定需要处理所有数据吗?
抽取数据的随机样本,例如前 1,000 行或 100,000 行。使用这个较小的样本来解决您的问题,然后再使用渐进式数据加载技术在所有数据上拟合最终模型。
我认为这对于机器学习来说是一个很好的通用实践,可以快速检查算法并获得结果。
您还可以考虑对用于拟合算法的数据量与模型技能进行敏感性分析。也许有一个自然的收益递减点,您可以将其用作较小样本的启发式大小。
3. 使用内存更大的计算机
您必须在您的计算机上工作吗?
也许您可以访问一台拥有数量级更多内存的更大计算机。
例如,一个不错的选择是在云服务(如 Amazon Web Services)上租用计算时间,该服务提供具有数十 GB RAM 的机器,每小时不到一美元。
我过去发现这种方法非常有用。
请参阅这篇博文
4. 更改数据格式
您的数据是否以纯文本 ASCII 格式存储,例如 CSV 文件?
也许您可以通过使用另一种数据格式来加快数据加载速度并减少内存使用。一个很好的例子是二进制格式,如 GRIB、NetCDF 或 HDF。
有许多命令行工具可用于将一种数据格式转换为另一种数据格式,而无需将整个数据集加载到内存中。
使用另一种格式可能允许您以更紧凑的形式存储数据,从而节省内存,例如 2 字节整数或 4 字节浮点数。
5. 流式传输数据或使用渐进式加载
所有数据是否需要同时加载到内存中?
也许您可以使用代码或库来根据需要流式传输或渐进式加载数据到内存中进行训练。
这可能需要能够使用优化技术(如随机梯度下降)进行迭代学习的算法,而不是需要所有数据都在内存中才能执行矩阵运算的算法,例如线性回归和逻辑回归的某些实现。
例如,Keras 深度学习库提供了此功能,用于渐进式加载图像文件,称为 flow_from_directory。
另一个例子是 Pandas 库,它可以 逐块加载大型 CSV 文件。
6. 使用关系数据库
关系数据库提供了存储和访问非常大的数据集的标准方法。
内部数据存储在磁盘上,可以分批渐进式加载,并可以使用标准查询语言 (SQL) 进行查询。
MySQL 或 Postgres 等免费开源数据库工具可以使用,并且大多数(或全部?)编程语言和许多机器学习工具都可以直接连接到关系数据库。您也可以使用轻量级方法,例如 SQLite。
我发现这种方法对于非常大的表格数据集来说非常有效。
同样,您可能需要使用能够处理迭代学习的算法。
7. 使用大数据平台
在某些情况下,您可能需要求助于大数据平台。
也就是说,一个专为处理非常大的数据集而设计的平台,允许您在其之上使用数据转换和机器学习算法。
两个很好的例子是 Hadoop(带有 Mahout 机器学习库)和 Spark(带有 MLLib 库)。
我相信这是最后的手段,当您已经尝试了上述所有选项时,如果仅仅是因为它给您的机器学习项目带来了额外的硬件和软件复杂性。
尽管如此,有些问题的数据量确实很大,而前面的选项无法解决。
总结
在这篇文章中,您了解了在处理机器学习的非常大的数据文件时可以使用的一些策略。
您还知道其他方法或尝试过吗?
请在下面的评论中分享。
您尝试过这些方法吗?
请在评论中告诉我。
如果原始数据由换行符分隔,例如 CSV、EDIFACT 等。那么在我所知的几乎所有语言中,都有一个功能可以通过套接字流一次只读取一行。这通常是任何(热门词汇警告)大数据解决方案的内部工作方式,没有什么神奇、困难或革命性的,实际上您会发现几乎任何简单的 GitHub 存储库在读取文件时都会这样做。
任何初学者都应该遇到过这一点,大学在任何计算机科学相关学位中都应该绝对教授这种基本概念,其中要求您从文件中读取内容。
只是想对此事有所启发,这 7 种方法实际上是 7 件事,如果您在博客文章中看到它们作为示例,您应该立即离开该网站,永不返回。
感谢您的意见 Chris,机器学习从业者有很多不同的类型。
你好 Chris,
如果你的数据是带有值的地理点,每一行代表一个不同的点,而你想识别跨越具有不同簇几何形状的点簇的模式呢?逐行源数据读取如何帮助我?
抱歉延迟回复。您说得对,文件可以逐行处理。然而,各种算法需要引用数据集中的几乎任何其他数据,或者在过程中创建的大量中间数据。因此,这些算法的内存需求更难减少。我凭空想到的,它们在代码中通过使用这些技术来完成……
有时会多次读取磁盘上的数据
有时中间数据足够小,可以挤进内存
有时以上都不可能,算法必须转到磁盘引用数据元素,因此它们将该数据放入某种索引结构中,例如 HBase 所做的那样。
有时它们可以分块处理,并使用类似梯度下降的方法,如这里所述
当训练集的大小变得太大而算法无法像您在此处建议的那样进行渐进式处理时,这是一个严重的工程问题
是的,这是完全不同的问题!
您好,您知道如何预处理 reuters-50-50 数据集吗?如果您知道,请帮助我。
其中一些技巧有点显而易见,但总的来说还是不错的。您可以为每个主题提供更多示例,例如“在 Y 类情况下使用文件格式 X”.. 此外,您可以提及像使用随机梯度下降或其他在线学习类型,您一次只输入一个示例。
感谢您的建议。
非常感谢这些信息。
希望获得更多关于机器学习的信息。
哦,对了,您还可以提到使用稀疏(而非密集)矩阵,因为它们占用的空间少得多,并且某些算法(如 SVM)可以直接处理稀疏特征矩阵。这里有一个解释 sklearn 的链接。
好建议。
我无法在最新版本的 pandas 中使用 df.to_sparse,您能帮帮我吗?
如果您是 Python 用户,我有一些建议。
对于内存外预处理
– 使用 dask dataframe 或 array 转换数据(它可以读取各种格式,CSV 等)
– 完成后,将 dask dataframe 或 array 保存到 Parquet 文件中,以便将来进行内存外预处理(参见 pyarrow)
对于内存处理
– 在可能的情况下使用更小的数据类型,例如 int8、float16 等。
– 如果它仍然无法放入内存,请将 dask dataframe 转换为稀疏 pandas dataframe
对于大数据,可以尝试 Greenplum(免费) https://greenplum.org/。它是 Postgres 的一个衍生版本。优点是查询跨核心并行处理。还有一个成熟的机器学习插件,名为 MADlib。
Peter,很好的建议,谢谢。
特征选择应用程序能否识别由大型数据集中多个列的部分组成的特征?或者,每个识别出的预测特征是否仅限于来自单列的数据?
它们通常关注单列。也许您可以深入研究研究,找到一些更复杂的方法。
嗨,Jason,
我在使用 NLTK 在 Hadoop/Spark 环境中分析文本时遇到了一个问题,问题是 NLTK 数据(语料库)无法在每个工作节点上找到(我只在工作节点上下载了 NLTK 数据,由于访问限制,我无法在每个工作节点上下载这些数据)。
您能否给我一些关于如何在每个工作节点上使用 NLTK 数据进行 NLP 分析的建议,而无需在每个工作节点上下载 NLTK 数据?
提前感谢。
抱歉,我没有在 Hadoop/Spark 中使用过 NLTK,无法给您好的建议。
嗨,Jason,
我想了解如何在实践中应用机器学习?例如,我开发了一个预测模型并且它有效,我该如何将其投入生产?
谢谢,
Azhaar
请看这篇文章
https://machinelearning.org.cn/deploy-machine-learning-model-to-production/
我有一个包含许多过程的日志数据。我如何将 ML 应用于新的日志数据以预测使用了哪些过程?
也许这篇文章能帮助您定义问题。
https://machinelearning.org.cn/how-to-define-your-machine-learning-problem/
嗨,Jason,
感谢这篇很棒的文章!!!
我很好奇为什么您说 Hadoop 和 Spark 等大数据平台是最后的选择?原因是什么?
谢谢你,
Daniel
只有在真正需要时,例如在您尝试了其他选项之后,并且您确实需要一个大数据平台时,才需要承担大量的开销。
我无意冒犯。如果您整天都在使用 Hadoop,并且想用它来处理小数据,那就尽管去做吧。
我在此重申一位评论者的观点。一些公司已经具备了这些能力,并且可能已经拥有了大部分相关数据。因此,在台式机上轻松运行失败后,Spark 可能是首选。强迫一台未存管的台式机处理问题可能会花费更长的时间。
另外,如果您没有内部系统运行,在 AWS 上启动 EMR(无论是否带 Spark)可能相当快。
我们笔记本电脑无法处理的商业问题太多了,以至于我们没有一些资源预备并准备就绪。
布朗利博士您好,
您的建议 #6 – 6. 使用关系数据库,这是我尝试使用 R 进行的,但失败了(知识不足)。我能够连接到 SQL 数据库中的某些感兴趣的列,但无法提取我需要的数据 – 您有什么推荐的资源给我阅读吗?任何建议都将不胜感激。
谢谢你!
我自己也做过,但那是很多年前的事了。抱歉,除了谷歌搜索,我没有其他好的资源可以推荐。
太棒了。感谢您分享您对此的看法
机器学习问题。🙂
它对我的当前项目帮助很大。
谢谢你
Liam
不客气。
您好,Jason Brownlee
我想将包含 120 万张图像和 15,000 个类别的非常大的图像数据集输入卷积神经网络。但是我无法将所有图像都输入 CNN,尽管我拥有 GTX 1080ti 11 GB GPU 和 32 GB CPU RAM。
我如何在有限的计算资源上训练我的模型处理这个非常大的图像数据集?
是否有任何技术可以让我使用多个图像块来训练我的模型。
也许您可以使用渐进式加载?我发现它对于小型计算机上的大型数据集非常有效。
您是指延迟加载吗?
不,您可以在训练期间定义一个数据生成器来按需加载/准备单个样本或一批样本供模型使用。
您能更详细地指导我吗?
我有很多例子,对于图像,从这里开始
https://machinelearning.org.cn/how-to-load-large-datasets-from-directories-for-deep-learning-with-keras/
对于自定义生成器,从这里开始
https://machinelearning.org.cn/develop-a-deep-learning-caption-generation-model-in-python/
增加内存作为参数:第一个链接提供的链接不再有效。您能否为同一目的推荐其他 URL?
您可以通过添加 -Xmx 标志来增加 Java 应用程序的内存,例如 8GB 使用 -Xmx8000m
你好,Jason!
这是一篇很好的文章。
我想知道,假设我有 3 亿行数据。
使用来自 3 亿行样本的自举法是否合法?
假设我使用带替换的样本来获取一个 3000 万行的集合,并从中创建 N 个集合。从每个集合中,我运行一个模型。
所以有点像装袋法,但每个集合中的行数少于实际行数。
这是否可行且逻辑上正确?
谢谢!
也许吧。这取决于您的模型对数据量的敏感程度,以及您有多少时间和计算资源可用。
嗨,Jason,
我有大约 960 个 .csv 文件,每个 .csv 文件包含一个人的语音/声音和 120 个转录。我应该将 960 个 .csv 文件合并成一个文件吗?
也许吧,这真的取决于您打算如何为问题建模。
如果我使用 Orange 怎么办?我使用该软件进行财务分析,因为我不是程序员,无法编码。Orange 能处理大量数据吗?
我不知道,抱歉。
先生,你好
使用 1 GB 的数据集(2000 个 .dicom 文件)进行深度学习是否可行?并将 epoch 从 20 减少到 10 以获得高精度?
谢谢。
或许可以试试看?
我获得了高精度。但我对此表示怀疑。
也许可以尝试一个替代的测试工具,看看结果是否仍然良好。
我再次运行,没有任何变化,但获得了另一个较低的准确率!!!
如何修复结果或原因是什么?
这是正常的行为,也是可以预料的。
https://machinelearning.org.cn/faq/single-faq/why-do-i-get-different-results-each-time-i-run-the-code
Jason,
我想补充一点,有一个内核级别的库可以将磁盘变成内存。
https://github.com/mimgrund/rambrain
现代 C++ 现在更像 Python 了。我认为这可能对一些人有所帮助。
感谢分享。
嗨,Jason,
我们正在使用机器学习模型,并将它们以CSV文件的形式存储在S3存储桶中。但是,每天我们新的存储桶都会比之前更大。最近,我们的S3存储桶是90兆字节,但有一天将达到太字节,那么我们如何才能轻量级地存储数据呢?有什么方法可以分享给我们吗?
我建议在服务器上运行大型模型或长时间运行的实验。
我建议只使用您的工作站进行小型实验,并确定要运行哪些大型实验。我在这里详细讨论了这种方法
机器学习开发环境
我推荐使用 Amazon EC2 服务,因为它提供对具有大量 RAM、大量 CPU 内核和大量 GPU 内核(用于深度学习)的基于 Linux 的服务器的访问。
您可以在这些帖子中学习如何为机器学习设置 EC2 实例
如何在 Amazon Web Services 上使用 Keras 开发和评估大型深度学习模型
如何使用亚马逊云服务(Amazon Web Services)在云端训练 XGBoost 模型
您可以在此帖子中学习在服务器实例上工作时的有用命令
Amazon Web Services 上的深度学习 10 个命令行技巧
当我有一个问题时,我首先会查看您的帖子,它们都非常清晰。非常感谢您。
您能否分享一篇关于如何使用MLLib实现神经网络进行图像分类的帖子?
Cansu,非常欢迎!我们感谢您的建议!