Python SVD使用Scikit Learn和Gensim,具有600万个功能

Python SVD使用Scikit Learn和Gensim,具有600万个功能,python,scikit-learn,gensim,svd,Python,Scikit Learn,Gensim,Svd,我试图根据段落的情感对其进行分类。我有60万份文件的培训数据。当我将它们转换为Tf-Idf向量空间,以单词为分析器,ngram范围为1-2时,几乎有600万个特征。所以我必须做奇异值分解(SVD)来减少特征 我试过gensim和sklearn的SVD功能。这两个功能都可以很好地减少到100个功能,但当我尝试使用200个功能时,它们就会抛出内存错误 另外,我没有使用整个文档(60万)作为培训数据,我只获取了50000个文档。因此,我的培训矩阵基本上是: 50000*600万,并希望将其减少到500

我试图根据段落的情感对其进行分类。我有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编写)?如果是,会快多少


系统规格:Ubuntu14.04上带有4个核心处理器的32 Gb RAM,我真的不明白为什么使用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您是否最终得到了一个解决方案,使其适用于所有文档?我很想知道这样的事情是否奏效,需要多少时间