[英]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.