处理机器学习大型数据文件的 7 种方法

探索和应用机器学习算法于无法载入内存的数据集是相当普遍的。

这会导致一些问题,例如:

  • 我如何加载我的多个千兆字节的数据文件?
  • 当我尝试运行我的数据集时,算法崩溃了,我该怎么办?
  • 你能帮我解决内存不足的错误吗?

在这篇文章中,我想提供一些您可能需要考虑的常见建议。

7 Ways to Handle Large Data Files for Machine Learning

处理机器学习大型数据文件的 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 库)。

我相信这是最后的手段,当您已经尝试了上述所有选项时,如果仅仅是因为它给您的机器学习项目带来了额外的硬件和软件复杂性。

尽管如此,有些问题的数据量确实很大,而前面的选项无法解决。

总结

在这篇文章中,您了解了在处理机器学习的非常大的数据文件时可以使用的一些策略。

您还知道其他方法或尝试过吗?
请在下面的评论中分享。

您尝试过这些方法吗?
请在评论中告诉我。

55 条回复:7 种处理机器学习大型数据文件的方法

  1. Chris 2017 年 5 月 29 日下午 6:59 #

    如果原始数据由换行符分隔,例如 CSV、EDIFACT 等。那么在我所知的几乎所有语言中,都有一个功能可以通过套接字流一次只读取一行。这通常是任何(热门词汇警告)大数据解决方案的内部工作方式,没有什么神奇、困难或革命性的,实际上您会发现几乎任何简单的 GitHub 存储库在读取文件时都会这样做。
    任何初学者都应该遇到过这一点,大学在任何计算机科学相关学位中都应该绝对教授这种基本概念,其中要求您从文件中读取内容。

    只是想对此事有所启发,这 7 种方法实际上是 7 件事,如果您在博客文章中看到它们作为示例,您应该立即离开该网站,永不返回。

    • Jason Brownlee 2017 年 6 月 2 日下午 12:24 #

      感谢您的意见 Chris,机器学习从业者有很多不同的类型。

    • MicrobicTiger 2017 年 6 月 2 日下午 1:24 #

      你好 Chris,

      如果你的数据是带有值的地理点,每一行代表一个不同的点,而你想识别跨越具有不同簇几何形状的点簇的模式呢?逐行源数据读取如何帮助我?

    • David Severson 2019 年 3 月 10 日下午 1:32 #

      抱歉延迟回复。您说得对,文件可以逐行处理。然而,各种算法需要引用数据集中的几乎任何其他数据,或者在过程中创建的大量中间数据。因此,这些算法的内存需求更难减少。我凭空想到的,它们在代码中通过使用这些技术来完成……

      有时会多次读取磁盘上的数据
      有时中间数据足够小,可以挤进内存
      有时以上都不可能,算法必须转到磁盘引用数据元素,因此它们将该数据放入某种索引结构中,例如 HBase 所做的那样。
      有时它们可以分块处理,并使用类似梯度下降的方法,如这里所述

      当训练集的大小变得太大而算法无法像您在此处建议的那样进行渐进式处理时,这是一个严重的工程问题

      • Jason Brownlee 2019 年 3 月 11 日上午 6:46 #

        是的,这是完全不同的问题!

      • malla pavani 2020 年 3 月 10 日下午 4:45 #

        您好,您知道如何预处理 reuters-50-50 数据集吗?如果您知道,请帮助我。

  2. felipe almeida 2017 年 5 月 30 日下午 4:43 #

    其中一些技巧有点显而易见,但总的来说还是不错的。您可以为每个主题提供更多示例,例如“在 Y 类情况下使用文件格式 X”.. 此外,您可以提及像使用随机梯度下降或其他在线学习类型,您一次只输入一个示例。

    • Jason Brownlee 2017 年 6 月 2 日下午 12:33 #

      感谢您的建议。

    • Senesie Mansaray 2024 年 8 月 1 日上午 4:58 #

      非常感谢这些信息。
      希望获得更多关于机器学习的信息。

  3. felipe almeida 2017 年 5 月 30 日下午 4:45 #

    哦,对了,您还可以提到使用稀疏(而非密集)矩阵,因为它们占用的空间少得多,并且某些算法(如 SVM)可以直接处理稀疏特征矩阵。这里有一个解释 sklearn 的链接。

    • Jason Brownlee 2017 年 6 月 2 日下午 12:34 #

      好建议。

    • Hesam 2021 年 3 月 9 日下午 8:25 #

      我无法在最新版本的 pandas 中使用 df.to_sparse,您能帮帮我吗?

  4. Peter Marelas 2017 年 5 月 30 日下午 9:29 #

    如果您是 Python 用户,我有一些建议。

    对于内存外预处理

    – 使用 dask dataframe 或 array 转换数据(它可以读取各种格式,CSV 等)
    – 完成后,将 dask dataframe 或 array 保存到 Parquet 文件中,以便将来进行内存外预处理(参见 pyarrow)

    对于内存处理

    – 在可能的情况下使用更小的数据类型,例如 int8、float16 等。
    – 如果它仍然无法放入内存,请将 dask dataframe 转换为稀疏 pandas dataframe

    对于大数据,可以尝试 Greenplum(免费) https://greenplum.org/。它是 Postgres 的一个衍生版本。优点是查询跨核心并行处理。还有一个成熟的机器学习插件,名为 MADlib。

  5. Lee Zee 2017 年 6 月 20 日上午 4:37 #

    特征选择应用程序能否识别由大型数据集中多个列的部分组成的特征?或者,每个识别出的预测特征是否仅限于来自单列的数据?

    • Jason Brownlee 2017 年 6 月 20 日上午 6:42 #

      它们通常关注单列。也许您可以深入研究研究,找到一些更复杂的方法。

  6. Dan 2017 年 8 月 14 日上午 11:58 #

    嗨,Jason,

    我在使用 NLTK 在 Hadoop/Spark 环境中分析文本时遇到了一个问题,问题是 NLTK 数据(语料库)无法在每个工作节点上找到(我只在工作节点上下载了 NLTK 数据,由于访问限制,我无法在每个工作节点上下载这些数据)。

    您能否给我一些关于如何在每个工作节点上使用 NLTK 数据进行 NLP 分析的建议,而无需在每个工作节点上下载 NLTK 数据?

    提前感谢。

    • Jason Brownlee 2017 年 8 月 15 日上午 6:28 #

      抱歉,我没有在 Hadoop/Spark 中使用过 NLTK,无法给您好的建议。

  7. Azhaar Hussain 2017 年 8 月 30 日上午 5:43 #

    嗨,Jason,

    我想了解如何在实践中应用机器学习?例如,我开发了一个预测模型并且它有效,我该如何将其投入生产?

    谢谢,
    Azhaar

  8. debraj 2017 年 8 月 31 日下午 7:23 #

    我有一个包含许多过程的日志数据。我如何将 ML 应用于新的日志数据以预测使用了哪些过程?

  9. Daniel 2017 年 11 月 20 日上午 3:56 #

    嗨,Jason,

    感谢这篇很棒的文章!!!
    我很好奇为什么您说 Hadoop 和 Spark 等大数据平台是最后的选择?原因是什么?

    谢谢你,

    Daniel

    • Jason Brownlee 2017 年 11 月 20 日上午 10:21 #

      只有在真正需要时,例如在您尝试了其他选项之后,并且您确实需要一个大数据平台时,才需要承担大量的开销。

      我无意冒犯。如果您整天都在使用 Hadoop,并且想用它来处理小数据,那就尽管去做吧。

    • David Severson 2019 年 3 月 10 日下午 1:40 #

      我在此重申一位评论者的观点。一些公司已经具备了这些能力,并且可能已经拥有了大部分相关数据。因此,在台式机上轻松运行失败后,Spark 可能是首选。强迫一台未存管的台式机处理问题可能会花费更长的时间。

      另外,如果您没有内部系统运行,在 AWS 上启动 EMR(无论是否带 Spark)可能相当快。

      我们笔记本电脑无法处理的商业问题太多了,以至于我们没有一些资源预备并准备就绪。

  10. oksana 2017 年 12 月 3 日上午 4:58 #

    布朗利博士您好,
    您的建议 #6 – 6. 使用关系数据库,这是我尝试使用 R 进行的,但失败了(知识不足)。我能够连接到 SQL 数据库中的某些感兴趣的列,但无法提取我需要的数据 – 您有什么推荐的资源给我阅读吗?任何建议都将不胜感激。
    谢谢你!

    • Jason Brownlee 2017 年 12 月 3 日上午 5:28 #

      我自己也做过,但那是很多年前的事了。抱歉,除了谷歌搜索,我没有其他好的资源可以推荐。

  11. Liam 2018 年 1 月 24 日下午 10:49 #

    太棒了。感谢您分享您对此的看法
    机器学习问题。🙂

    它对我的当前项目帮助很大。

    谢谢你

    Liam

  12. Bhavika Panara 2018 年 5 月 22 日下午 10:22 #

    您好,Jason Brownlee

    我想将包含 120 万张图像和 15,000 个类别的非常大的图像数据集输入卷积神经网络。但是我无法将所有图像都输入 CNN,尽管我拥有 GTX 1080ti 11 GB GPU 和 32 GB CPU RAM。

    我如何在有限的计算资源上训练我的模型处理这个非常大的图像数据集?

    是否有任何技术可以让我使用多个图像块来训练我的模型。

  13. Anjali Batra 2018 年 8 月 28 日下午 8:20 #

    增加内存作为参数:第一个链接提供的链接不再有效。您能否为同一目的推荐其他 URL?

    • Jason Brownlee 2018 年 8 月 29 日上午 8:10 #

      您可以通过添加 -Xmx 标志来增加 Java 应用程序的内存,例如 8GB 使用 -Xmx8000m

  14. Sintyadi Thong 2019 年 4 月 23 日下午 2:07 #

    你好,Jason!
    这是一篇很好的文章。

    我想知道,假设我有 3 亿行数据。
    使用来自 3 亿行样本的自举法是否合法?

    假设我使用带替换的样本来获取一个 3000 万行的集合,并从中创建 N 个集合。从每个集合中,我运行一个模型。

    所以有点像装袋法,但每个集合中的行数少于实际行数。

    这是否可行且逻辑上正确?

    谢谢!

    • Jason Brownlee 2019 年 4 月 23 日下午 2:33 #

      也许吧。这取决于您的模型对数据量的敏感程度,以及您有多少时间和计算资源可用。

  15. Eric Ngo 2019 年 5 月 26 日上午 6:56 #

    嗨,Jason,
    我有大约 960 个 .csv 文件,每个 .csv 文件包含一个人的语音/声音和 120 个转录。我应该将 960 个 .csv 文件合并成一个文件吗?

    • Jason Brownlee 2019 年 5 月 27 日上午 6:35 #

      也许吧,这真的取决于您打算如何为问题建模。

  16. Ashley 2019 年 7 月 3 日上午 9:16 #

    如果我使用 Orange 怎么办?我使用该软件进行财务分析,因为我不是程序员,无法编码。Orange 能处理大量数据吗?

  17. shivan mohammed 2020 年 3 月 31 日上午 5:43 #

    先生,你好
    使用 1 GB 的数据集(2000 个 .dicom 文件)进行深度学习是否可行?并将 epoch 从 20 减少到 10 以获得高精度?
    谢谢。

  18. shivan mohammed 2020 年 4 月 4 日凌晨 12:45 #

    我获得了高精度。但我对此表示怀疑。

  19. Cornelius 2021 年 2 月 23 日晚上 11:30 #

    Jason,

    我想补充一点,有一个内核级别的库可以将磁盘变成内存。

    https://github.com/mimgrund/rambrain

    现代 C++ 现在更像 Python 了。我认为这可能对一些人有所帮助。

  20. Denver 2022年1月26日 凌晨4:26 #

    嗨,Jason,

    我们正在使用机器学习模型,并将它们以CSV文件的形式存储在S3存储桶中。但是,每天我们新的存储桶都会比之前更大。最近,我们的S3存储桶是90兆字节,但有一天将达到太字节,那么我们如何才能轻量级地存储数据呢?有什么方法可以分享给我们吗?

    • James Carmichael 2022年1月26日 上午11:05 #

      我建议在服务器上运行大型模型或长时间运行的实验。

      我建议只使用您的工作站进行小型实验,并确定要运行哪些大型实验。我在这里详细讨论了这种方法

      机器学习开发环境
      我推荐使用 Amazon EC2 服务,因为它提供对具有大量 RAM、大量 CPU 内核和大量 GPU 内核(用于深度学习)的基于 Linux 的服务器的访问。

      您可以在这些帖子中学习如何为机器学习设置 EC2 实例

      如何在 Amazon Web Services 上使用 Keras 开发和评估大型深度学习模型
      如何使用亚马逊云服务(Amazon Web Services)在云端训练 XGBoost 模型
      您可以在此帖子中学习在服务器实例上工作时的有用命令

      Amazon Web Services 上的深度学习 10 个命令行技巧

  21. Cansu 2023年3月22日 凌晨1:19 #

    当我有一个问题时,我首先会查看您的帖子,它们都非常清晰。非常感谢您。
    您能否分享一篇关于如何使用MLLib实现神经网络进行图像分类的帖子?

    • James Carmichael 2023年3月22日 上午9:58 #

      Cansu,非常欢迎!我们感谢您的建议!

留下回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。