Scikit-learn的dump_svmlight_file很慢

时间:2013-09-19 15:58:33

标签: python scipy scikit-learn libsvm

将大约500万个非零元素的10,000 x 40,000个CSR矩阵转储到/ dev / null大约需要6分钟。有更快的替代方案吗?

将其转换为另一种稀疏格式无济于事。

3 个答案:

答案 0 :(得分:2)

current implementation在0.14中非常天真。您可以尝试使用line_profiler对其进行分析,以找到主要瓶颈。

如果你找到一种更快的方法来实现它(可选择使用cython作为加载器),那么请随意打开拉取请求。

答案 1 :(得分:2)

如果您升级到scikit-learn(或复制粘贴this file到您的安装中)的前沿开发版本,您将获得比以前快十倍的dump_svmlight_file

答案 2 :(得分:0)

编辑:忽略以下答案!实际上,scikit-learn实现的作者有一个Cython based dumper。它可以在3秒内转储相同的矩阵。

以下在60秒内运行,其中6个在循环之外。它利用了COO矩阵基本上已经是正确格式的事实。

def dump_svmlight_file_sparse(X, y, f, zero_based=True):
    X = X.sorted_indices().tocoo()

    if not zero_based:
        X.col += 1

    y = y.astype(int).astype(str)
    col = X.col.astype(str)
    dat = X.data.astype(str)

    last_row = 0
    f.write(y[0])

    for i in xrange(len(X.data)):
        while last_row < X.row[i]:
            last_row += 1
            f.write('\n'+y[last_row])

        f.write(' '+col[i]+':'+dat[i])

    f.write('\n')