我有一个大数据集(10 000行),其中每一行(样本)都由一个位列表(~200 000位)表示,.Each位表示示例中缺少或存在该特性。所以,(**10 000 x 200 000**)是一个大型的高维稀疏数据集
为了节省一些内存空间,对于每个样本,我只保存非零位的索引。具有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。对由sklearn.svm.LinearSVC表示的数据进行了线性支持向量分类模型( sklearn.svm.LinearSVC)的训练。知道上述模型接受稀疏输入,并且在SciPy中可能有七种表示
哪种表示法对训练模型更有效?我如何有效地从X传递到该表示?
发布于 2017-04-07 19:12:26
csr是一种可行的方法,得到了滑雪板来源的支持。节选:
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()还请记住,您传递的所有数据都是在内部转换为lib线性的,sklearn使用的外部库有它自己的数据结构。因此,如果您传递错误的格式,这是一个一次性的转换成本,应该发生。纯粹的训练--程序不在乎!
发布于 2017-04-07 19:40:57
所有格式都有可转换为其他格式的to...方法。所以你可以用一种格式构建,用另一种格式进行计算,而不需要太多额外的成本。
coo.tocsr(...)被广泛应用。注意,它可以使用coo样式的输入。要使用indptr风格的输入,您必须了解更多关于格式的知识。csr的一个变体。有点像它的转座子。coo格式。适用于自然面向块的应用程序。https://stackoverflow.com/questions/43284717
复制相似问题