簡體   English   中英

如何將生成的id,索引列表值元組轉換為一個熱編碼的稀疏矩陣

[英]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.rowsl.data是此處的真實列表,因此您可以在出現數據時附加它們。 在這種情況下,您需要注意shape scipy從其他數據生成這些lil_matrix ,它將放置lil_matrix dtype object數組,但它們也幾乎是列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM