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

Posted

技术标签:

【中文标题】将大型 csv 转换为稀疏矩阵以在 sklearn 中使用【英文标题】:Convert large csv to sparse matrix for use in sklearn 【发布时间】:2020-08-28 15:33:30 【问题描述】:

我有一个以 csv 格式保存的 ~30GB(~1.7 GB 压缩 | 180K 行 x 32K 列)矩阵。我想将此矩阵转换为稀疏格式,以便能够将完整的数据集加载到内存中,以便使用 sklearn 进行机器学习。填充的单元格包含小于 1 的浮点数。大矩阵的一个警告是目标变量存储为最后一列。允许在 sklearn 中使用这个大矩阵的最佳方法是什么? IE。 如何在不将原始矩阵加载到内存的情况下将 ~30GB csv 转换为 scipy 稀疏格式?

伪代码

    删除目标变量(保持顺序不变) 将 ~30 GB 矩阵转换为稀疏格式(帮助!!) 将稀疏格式加载到内存和目标变量中以运行机器学习管道(我该怎么做?)

【问题讨论】:

不妨试试这个:gist.github.com/oddskool/27476a1e22df357de798 嗨@jcrudy,感谢您分享这个要点,但是看起来它在将原始矩阵转换为稀疏矩阵之前将其加载到内存中。我的原始矩阵约为 30GB,可以加载到我机器上的内存中。 根据我的阅读,上面链接的解决方案一次只加载一行 csv 文件。整个稀疏矩阵是在内存中构造的,但密集版本不是。 嗨@jcrudy,你是对的!要点确实通过加载行来操作。我不确定如何编辑要点以在我自己的 csv 上进行操作。感谢您为我指明正确的方向。 【参考方案1】:

您可以很容易地在内存中逐行构建稀疏矩阵:

import numpy as np
import scipy.sparse as sps

input_file_name = "something.csv"
sep = "\t"

def _process_data(row_array):
    return row_array

sp_data = []
with open(input_file_name) as csv_file:
    for row in csv_file:
        data = np.fromstring(row, sep=sep)
        data = _process_data(data)
        data = sps.coo_matrix(data)
        sp_data.append(data)


sp_data = sps.vstack(sp_data)

这将更容易写入 hdf5,这是一种比文本文件更好的方式来存储这种规模的数字。

【讨论】:

这非常适合将行转换为稀疏矩阵格式!谢谢!

以上是关于将大型 csv 转换为稀疏矩阵以在 sklearn 中使用的主要内容,如果未能解决你的问题,请参考以下文章

将 pandas 稀疏数据帧转换为稀疏 numpy 矩阵以供 sklearn 使用?

大型稀疏矩阵分解

将 Python 字典列表转换为 SciPy 稀疏矩阵

sklearn OneHotEncoder 与 ColumnTransformer 导致稀疏矩阵代替创建假人

将 CountVectorizer 和 TfidfTransformer 稀疏矩阵转换为单独的 Pandas 数据帧行

哪个稀疏矩阵表示与 sklearn.svm.LinearSVC 一起使用