与sklearn.svm.LinearSVC一起使用的稀疏Matrix表示形式

时间:2017-04-07 18:19:21

标签: python scipy scikit-learn sparse-matrix

我有一个大数据集(10 000行),其中每一行(样本)由一个位列表(〜200 000位)表示。每个位表示不存在或存在样本中的特征。所以,它是一个大的(10 000 x 200 000)高维稀疏数据集

为了节省一些存储空间,对于每个样本,我只保存非零位的索引。 具有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表示的数据进行训练。知道前面提到的模型接受稀疏输入,SciPy中有七种表示:

  • csc_matrix:压缩稀疏列格式
  • csr_matrix:压缩的稀疏行格式
  • bsr_matrix:阻止稀疏行格式
  • lil_matrix:列表格式列表
  • dok_matrix:密钥格式字典
  • coo_matrix:COOrdinate格式(又名IJV,三元组格式)
  • dia_matrix:DIAgonal格式

哪种表示更有效地训练模型?以及如何有效地从X传递到该表示?

2 个答案:

答案 0 :(得分: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使用的外部库具有自己的数据结构。所以如果你传递错误的格式;这是应该发生的一次性转换成本。 培训程序并不关心!

答案 1 :(得分:0)

所有格式都有to...种方法可转换为其他格式。因此,您可以构建一种格式,并在另一种格式中进行计算,而无需太多额外成本。

  • coo_matrix - 对此的输入很容易理解和创建 - 只有3个相同长度的数组。 如果你已经有一个密集的数组,只需将它赋予这种格式,它就会提取索引。

  • csr_matrix - 这是实现大多数计算的格式。 coo.tocsr(...)被广泛使用。请注意,它可以使用coo样式的输入。您必须了解有关使用indptr输入方式的格式的更多信息。

  • csc_matrix - 只是csr的变体。它的转置排序。

  • lil_matrix - 这也很容易理解。并且适用于逐步构建矩阵。 不如密集阵列的增量更改。

  • bsr_matrix - 真的是一种从较小的矩阵构建矩阵的方法。内部使用coo格式。对于天然面向块的应用程序。

  • dok_matrix - 实际上是一个字典子类。确定增量使用,但仍然比使用类似键填充自己的字典慢。

  • dia_matrix - 允许您根据对角线定义矩阵。只是一种中介格式。仅在代码具有强对角线方面时才有用。