[英]How to convert generated id, list-of-index values tuple to a one hot encoded sparse matrix
我正在尝试找到将数据转换为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矩阵 ,但是在使用生成器构造时很难确定如何转换我拥有的数据。
有什么建议吗? 对其他方法也开放,我对这样的问题还比较陌生。
您的数据格式几乎是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
,它将放置lil_matrix
dtype object
数组,但它们也几乎是列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.