sklearn.svm.LinearSVC 使用哪种稀疏矩阵表示
Which sparse Matrix representation to use with sklearn.svm.LinearSVC
我有一个大数据集(10 000
行),其中每一行(样本)由一个位列表(~200 000
位)表示。每个位代表不存在或存在样本中的特征。所以,这是一个大的(10 000 x 200 000
)高维稀疏数据集
为了节省一些内存space,对于每个样本,我只保存非零位的索引。
具有 7 个特征的向量示例:
[0, 0, 1, 0, 0, 1, 1] ===> [2, 5, 6]
我正在对所有数据集执行此操作。令结果为 X
(10 000
可变大小向量)。初始数据集示例 3x4
:
[[0,0,1,0], [[2],
initial_data= [0,1,1,0], ===> [1,2], = X
[0,1,0,1]] [1,3]]
每行都标有以下两个标签之一:malignant
或benign
。
在 X
表示的数据上训练线性支持向量分类模型(sklearn.svm.LinearSVC
中的模型)。知道上述模型接受稀疏输入并且在 SciPy
:
中有七种可能的表示
- csc_matrix:压缩稀疏列格式
- csr_matrix: 压缩稀疏行格式
- bsr_matrix:块稀疏行格式
- lil_matrix:列表格式
- dok_matrix:键值字典格式
- coo_matrix:坐标格式(又名 IJV,三元组格式)
- dia_matrix: 对角线格式
哪种表示对训练模型更有效?以及如何有效地从 X
传递到该表示形式?
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 使用的外部库具有自己的数据结构。因此,如果您传递错误的格式;这是应该发生的一次性转换成本。 纯训练过程不关心!
所有格式都有 to...
转换为其他格式的方法。因此,您可以以一种格式构建,并以另一种格式进行计算,而无需太多额外成本。
coo_matrix - 对此的输入很容易理解和创建 - 只有 3 个相同长度的数组。
如果您已经有一个密集数组,只需将其指定为这种格式,它就会提取索引。
csr_matrix - 这是实现大多数计算的格式。 coo.tocsr(...)
被广泛使用。请注意,它可以使用 coo
样式的输入。您必须了解更多有关格式的知识才能使用 indptr
样式的输入。
csc_matrix - 只是 csr
的变体。对其转置排序。
lil_matrix——这个也很好理解。并且适度适合增量构建矩阵。
不如对密集数组进行增量更改。
bsr_matrix - 确实是一种从一堆较小的矩阵构建矩阵的方法。在内部使用 coo
格式。对于自然面向块的应用程序。
dok_matrix - 实际上是一个字典子类。适合增量使用,但仍然比使用类似键填充您自己的字典慢。
dia_matrix - 允许您根据对角线定义矩阵。只是一种中间格式。仅当您的代码具有很强的对角线方面时才有用。
我有一个大数据集(10 000
行),其中每一行(样本)由一个位列表(~200 000
位)表示。每个位代表不存在或存在样本中的特征。所以,这是一个大的(10 000 x 200 000
)高维稀疏数据集
为了节省一些内存space,对于每个样本,我只保存非零位的索引。 具有 7 个特征的向量示例:
[0, 0, 1, 0, 0, 1, 1] ===> [2, 5, 6]
我正在对所有数据集执行此操作。令结果为 X
(10 000
可变大小向量)。初始数据集示例 3x4
:
[[0,0,1,0], [[2],
initial_data= [0,1,1,0], ===> [1,2], = X
[0,1,0,1]] [1,3]]
每行都标有以下两个标签之一:malignant
或benign
。
在 X
表示的数据上训练线性支持向量分类模型(sklearn.svm.LinearSVC
中的模型)。知道上述模型接受稀疏输入并且在 SciPy
:
- csc_matrix:压缩稀疏列格式
- csr_matrix: 压缩稀疏行格式
- bsr_matrix:块稀疏行格式
- lil_matrix:列表格式
- dok_matrix:键值字典格式
- coo_matrix:坐标格式(又名 IJV,三元组格式)
- dia_matrix: 对角线格式
哪种表示对训练模型更有效?以及如何有效地从 X
传递到该表示形式?
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 使用的外部库具有自己的数据结构。因此,如果您传递错误的格式;这是应该发生的一次性转换成本。 纯训练过程不关心!
所有格式都有 to...
转换为其他格式的方法。因此,您可以以一种格式构建,并以另一种格式进行计算,而无需太多额外成本。
coo_matrix - 对此的输入很容易理解和创建 - 只有 3 个相同长度的数组。 如果您已经有一个密集数组,只需将其指定为这种格式,它就会提取索引。
csr_matrix - 这是实现大多数计算的格式。
coo.tocsr(...)
被广泛使用。请注意,它可以使用coo
样式的输入。您必须了解更多有关格式的知识才能使用indptr
样式的输入。csc_matrix - 只是
csr
的变体。对其转置排序。lil_matrix——这个也很好理解。并且适度适合增量构建矩阵。 不如对密集数组进行增量更改。
bsr_matrix - 确实是一种从一堆较小的矩阵构建矩阵的方法。在内部使用
coo
格式。对于自然面向块的应用程序。dok_matrix - 实际上是一个字典子类。适合增量使用,但仍然比使用类似键填充您自己的字典慢。
dia_matrix - 允许您根据对角线定义矩阵。只是一种中间格式。仅当您的代码具有很强的对角线方面时才有用。