我正试图找出将数据转换为numpy / scipy稀疏矩阵的最佳方法。我不需要以这种格式进行任何繁重的计算。我只需要能够将数据从密集的,太大的内存csv转换为我可以将其传递给sklearn估算器的内容。我的理论是,稀疏数据应该适合记忆。
因为所有功能都是分类的,所以我使用生成器来迭代文件,并使用哈希技巧对一个热门编码:
def get_data(train=True):
if traindata:
path = '../originalData/train_rev1_short_short.csv'
else:
path = '../originalData/test_rev1_short.csv'
it = enumerate(open(path))
it.next() # burn the header row
x = [0] * 27 # initialize row container
for ix, line in it:
for ixx, f in enumerate(line.strip().split(',')):
# Record sample id
if ixx == 0:
sample_id = f
# If this is the training data, record output class
elif ixx == 1 and train:
c = f
# Use the hashing trick to one hot encode categorical features
else:
x[ixx] = abs(hash(str(ixx) + '_' + f)) % (2 ** 20)
yield (sample_id, x, c) if train else (sample_id, x)
结果是这样的行:
10000222510487979663 [1, 3, 66642, 433470, 960966, ..., 802612, 319257, 80942]
10000335031004381249 [1, 2, 87543, 394759, 183945, ..., 773845, 219833, 64573]
第一个值是样本ID,列表是具有“1”值的列的索引值。
将它变成numpy / scipy稀疏矩阵的最有效方法是什么?我唯一的要求是快速逐行写入/读取和sklearn兼容性。根据scipy文档,似乎CSR matrix似乎是我需要的,但是我在使用生成器构造时想出转换数据时遇到了一些麻烦。
有什么建议吗?打开另外的方法,我对这样的问题比较新。
答案 0 :(得分:1)
您的数据格式几乎是scipy.sparse.lil_matrix
(列表列表)的内部结构。您应首先生成其中一个,然后在其上调用.tocsr()
以获取所需的csr矩阵。
关于如何填充这些内容的一个小例子:
from scipy.sparse import lil_matrix
positions = [[1, 2, 10], [], [5, 6, 2]]
data = [[1, 1, 1], [], [1, 1, 1]]
l = lil_matrix((3, 11))
l.rows = positions
l.data = data
c = l.tocsr()
其中data
只是一个镜像positions
和positions
结构列表的列表,对应于您的要素索引。正如您所看到的,属性l.rows
和l.data
是真实的列表,因此您可以随附数据。在这种情况下,您需要小心shape
。当scipy
从其他数据生成这些lil_matrix
时,它会放置dtype object
的数组,但这些数组也几乎都是列表。