2017-04-07 53 views
0

我有一個大的數據集(10 000行),其中每行(樣本)由位列表(〜200 000位)表示。每個位表示缺席或樣品中特徵的存在。因此,這是一個大的(10 000 x 200 000)高維稀疏數據集哪個稀疏矩陣表示使用sklearn.svm.LinearSVC

爲了節省一些內存空間,對每個樣品,我只保存非零位的索引。 實施例用於與7個特徵的矢量:

[0, 0, 1, 0, 0, 1, 1] ===> [2, 5, 6]

我這樣做是爲所有的數據集。讓結果爲X10 000可變大小的向量)。爲例用於初始數據集3x4

    [[0,0,1,0],  [[2], 
    initial_data= [0,1,1,0], ===> [1,2], = X 
        [0,1,0,1]]  [1,3]] 

每一行被標記或者在兩個標記:malignantbenign。 線性支持向量分類模型(sklearn.svm.LinearSVC中的那個)在X表示的數據上訓練。知道的是,上述模型接受稀疏輸入和有7只表示可以在SciPy

  • csc_matrix:壓縮稀疏列格式
  • csr_matrix:壓縮稀疏行格式
  • bsr_matrix:塊稀疏行格式
  • lil_matrix:列表格式列表
  • dok_matrix:密鑰字典格式
  • coo_matrix:COOrdinate格式(又名IJV,三元組格式)
  • dia_matrix:對角線格式

這表示是訓練模型更有效?我怎樣纔能有效地從X傳遞到表示?

回答

3

csr是要走的路,這是sklearn's sources支持。摘錄:

class LinearSVC(BaseEstimator, LinearClassifierMixin, 
      _LearntSelectorMixin, SparseCoefMixin): 
    ... 
    ... 
    X, y = check_X_y(X, y, accept_sparse='csr', 
        dtype=np.float64, order="C") 

CSR和許多其他格式不推薦用於直接建立一個稀疏矩陣(添加的東西/改變稀疏性的結構是非常昂貴的)。

使用dok_matrix/lil_matrix從您的數據(應該很簡單)構建一個稀疏矩陣,然後轉換(這是線性時間完成的)。

X = X.tocsr() 

也請記住,所有你傳遞的數據作爲liblinear內部轉換,通過sklearn使用的外部庫有它自己的數據結構。所以如果你通過錯誤的格式;這是應該發生的一次性轉換成本。 培訓程序不關心!

0

所有格式都有to...轉換爲其他格式的方法。因此,您可以構建一種格式,並在另一種格式中進行計算,而無需太多額外成本。

  • coo_matrix - 這個輸入很容易理解和創建 - 只有3個相同長度的數組。 如果你已經有了一個密集的數組,只需將它賦予這種格式,並且它將提取索引。

  • csr_matrix - 這是實現大多數計算的格式。 coo.tocsr(...)被廣泛使用。請注意,它可以使用coo風格的輸入。您必須瞭解更多關於使用indptr風格輸入的格式。

  • csc_matrix - 只是csr的變體。它的轉置排序。

  • lil_matrix - 這也很容易理解。對於逐漸構建矩陣來說,這是適當的。 不如對密集數組的增量更改。

  • bsr_matrix - 實際上是一種從一堆小的矩陣中構建矩陣的方法。內部使用coo格式。對於自然以塊爲導向的應用程序。

  • dok_matrix - 實際上是一個字典子類。確定增量使用,但仍比使用類似鍵填充自己的字典要慢。

  • dia_matrix - 讓您根據對角線定義矩陣。只是中間格式。僅當您的代碼具有強對角線方面時纔有用。