如何将生成的id,index-of-index值元组转换为一个热编码稀疏矩阵

时间:2014-11-11 15:24:07

标签: python numpy scipy

我正试图找出将数据转换为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似乎是我需要的,但是我在使用生成器构造时想出转换数据时遇到了一些麻烦。

有什么建议吗?打开另外的方法,我对这样的问题比较新。

1 个答案:

答案 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只是一个镜像positionspositions结构列表的列表,对应于您的要素索引。正如您所看到的,属性l.rowsl.data是真实的列表,因此您可以随附数据。在这种情况下,您需要小心shape。当scipy从其他数据生成这些lil_matrix时,它会放置dtype object的数组,但这些数组也几乎都是列表。