处理大型数据集 python

数据挖掘 Python 大数据
2022-02-10 20:12:17

我的数据文件是 4 GB (json),我需要在这个数据集上应用所有内容(从应用聚类/ML 算法到争论它),就像人们对 pandas/scikit 所做的那样。但是在我的本地机器上很难使用它们。我尝试使用daskblaze,但由于功能有限,无法找到它们对我的情况有效。我不想使用 hadoop,因为它不适用于如此小的数据集。

我想知道使用 python 处理不太大的数据集并在它们上应用 ML 算法的方法。就像您使用 pandas(如果存在)处理小型数据集的方式一样。

3个回答

使用当今个人台式机或笔记本电脑的标准 RAM 量(通常为 8Gb 或更多),处理 4Gb 内存应该没有什么问题。如果您的硬件设置内存不足,并且您的 ML 算法使您的 SO 开始分页,那么最好的提示是使用不复制数据的算法和设置,而是在适当的位置完成所有操作。

pandas中,许多操作都提供了一个精确调用的布尔参数inplace来控制这种行为,例如DataFrame.reset_indexNumpy还支持就地操作,例如sort

考虑到:

  • inplace=True不保证操作实际执行到位,它只是一个提示,可能会或可能不会兑现。
  • 对于一些操作。inplace=True可能会降低性能,例如dropna.

综上所述,根据我的经验,inplace=True实际上内存消耗有所不同,可用于避免分页,从而使计算能够完全在 RAM 中进行,以用于像您这样的数据集。

最后,注意inplace默认值。如熊猫文档中的此警告所述

警告:为了向后兼容,如果未指定,就地默认为 True。这将在熊猫的未来版本中发生变化 - 如果您的代码依赖于就地分配,您应该更新以显式设置 inplace=True

至少有两种简单的方法可以处理这个问题。如果您的数据有很多零等,则可能值得尝试将其加载为sparse dataframe

始终有效的一件事是以迭代方式处理您的数据。对于大多数数据类型,pandas 可以让您遍历文件,例如使用pandas.read_csv(data, iterator=True). 这不适用于 JSON 数据,但您可以改用该ijson

许多 scikit-learn 算法也可以一次在一个或几个样本(小批量)上进行迭代训练。特别是具有随机梯度下降的灵活线性模型(SGDClassifier 和 SGDRegressor)。对于集群,您可以使用MiniBatchKMeans您可以在文档中阅读有关此内容的更多信息

如果您的数据几乎适合内存,您可以尽可能多地读入。如果其中大部分不适合,则可能无法在不进行一些调整的情况下让您使用 pandas/sklearn。

您可以做的一件事是在使用 dtypes 选项加载数据集时显式设置类型,即 (... dtype={'ORDER NO': np.int32, 'CUSTOMER': str} ...) - 这可能会节省内存当您加载文件时。