Numpy/scipy 加载巨大的稀疏矩阵以在 scikit-learn 中使用

Posted

技术标签:

【中文标题】Numpy/scipy 加载巨大的稀疏矩阵以在 scikit-learn 中使用【英文标题】:Numpy/scipy load huge sparse matrix to use in scikit-learn 【发布时间】:2016-01-04 19:31:29 【问题描述】:

我在 csv 文件中有一个包含 40,000 行和 5000 列布尔值(1 和 0)的数据集。我无法将其加载到 numpy 中,因为它会抛出 MemoryError

我尝试将其加载到稀疏矩阵中,如以下问题所述:csv to sparse matrix in python

但是这种格式不能在 scikit-learn 中使用。有没有办法在 csv 中读取到实际上可以被 scikit-learn 使用的稀疏矩阵?

将矩阵直接加载到 numpy 是通过以下方式完成的:

matrix = np.loadtxt('data.csv', skiprows=1, delimiter=',')

【问题讨论】:

csv 文件是否包含所有这些 1 和 0? 10000 个字符长的行(带分隔符)?还有 40,000 行? 密集阵列需要 800 MB 的内存,而不是疯狂的数量。如果您的 PC 性能不错,并且您使用的是 64 位 python,那么它应该适合 RAM。然而numpy.loadtxtnumpy.genfromtxt 是出了名的内存消耗,也许numpy.fromfile 可以工作? @moarningsun,磁盘上实际有 370MB。我有一台很好的笔记本电脑,有很多内存(16Gb),但是拥有 32 位版本的 python 可能确实会导致加载问题。虽然我想数据集不会超过 2Gb.. @Tim - 哎呀,你是对的,我算错了.. 它应该只需要 200 Mb (191 MB) 的 RAM(使用 dtype bool(u)int8)。你是如何尝试加载它给出 MemoryError 的?无论如何,如果您要进行机器学习,我认为您迟早会需要 64 位 Python。 您提到加载到稀疏矩阵中,就像您链接的问题的答案一样。这是导致MemoryError 的确切代码吗?就像前面提到的 cmets 一样,如果您可以提供您正在加载的数据的样本以及您用于加载数据的代码的 sn-p,这将对我们有所帮助。它很可能与您运行的 Python/系统有关,但也可能与您加载数据的方式有关。 【参考方案1】:

您提供的问题的答案产生了一个 lil_matrix。根据 scipy 文档 here,您可以调用 matrix.tocsr() 将其转换为 csr_matrix。这应该可以在允许稀疏矩阵的 sklearn 例程中使用。将您的数据直接读入 csr_matrix 会更优雅,但是对于您的布尔值数据集,这应该可以正常工作。

【讨论】:

以上是关于Numpy/scipy 加载巨大的稀疏矩阵以在 scikit-learn 中使用的主要内容,如果未能解决你的问题,请参考以下文章

[使用Python,NumPy,SciPy使用矩阵乘法对矩阵进行有效切片

初步理解Numpy, Scipy, matplotib, pandas,

将大型 csv 转换为稀疏矩阵以在 sklearn 中使用

将稀疏 scipy 矩阵加载到现有的 numpy 密集矩阵中

Python (NumPy, SciPy),寻找矩阵的零空间

巨大的稀疏数据帧到 scipy 稀疏矩阵,无需密集变换