将大型 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 使用?
sklearn OneHotEncoder 与 ColumnTransformer 导致稀疏矩阵代替创建假人