【问题标题】:SVD using Scikit-Learn and Gensim with 6 million featuresSVD 使用具有 600 万个特征的 Scikit-Learn 和 Gensim
【发布时间】:2017-07-08 01:43:26
【问题描述】:

我正在尝试根据他们的情绪对段落进行分类。我有 60 万个文档的训练数据。当我将它们转换为 Tf-Idf 向量空间时,单词作为分析器,ngram 范围为 1-2,几乎有 600 万个特征。所以我必须做奇异值分解(SVD)来减少特征。

我已经尝试过 gensim 和 sklearn 的 SVD 功能。两者都可以很好地减少功能直到 100,但是一旦我尝试 200 个功能,它们就会抛出内存错误。

我还没有使用整个文档(60 万个)作为训练数据,我只取了 50000 个文档。所以基本上我的训练矩阵是: 50000 * 600 万,想减少到 50000 * (100 到 500)

有没有其他方法可以在 python 中实现它,或者我必须实现 sparks mllib SVD(仅为 java 和 scala 编写)?如果是,会快多少?

系统规格:在 ubuntu 14.04 上具有 4 个核心处理器的 32 Gb RAM

【问题讨论】:

    标签: python scikit-learn gensim svd


    【解决方案1】:

    我真的不明白为什么使用 sparks mllib SVD 会提高性能或避免内存错误。您只是超出了 RAM 的大小。你有一些选择来解决这个问题:

    • 减少 tf-idf 的字典大小(例如使用 scikit-learn 的 max_df 和 min_df 参数)。
    • 使用散列矢量化器代替 tf-idf。
    • 获取更多 RAM(但有时 tf-idf + SVD 不可扩展)。

    此外,您应该展示您的代码示例,您可能在 python 代码中做错了什么。

    【讨论】:

    • 感谢您的建议。我应该使用 max_df 和 min_df 参数。另外我还没有看过散列矢量化器,所以我会看看我能用它做什么。
    • 嗨,我有类似的情况,但 Spark 不进行分布式训练,所以这不应该有助于解决内存问题吗?另外@dudefrmbgr 你最终得到了一个解决方案来使它适用于所有文件吗?我很想知道这样的事情是否奏效以及需要多少时间
    猜你喜欢
    • 2017-03-09
    • 2018-09-25
    • 2015-01-31
    • 2016-02-25
    • 2018-02-24
    • 2017-05-02
    • 2019-01-10
    • 2014-02-17
    • 2014-11-05
    相关资源
    最近更新 更多