如何减少 Scikit-Learn Vectorizer 的内存使用量?

Posted

技术标签:

【中文标题】如何减少 Scikit-Learn Vectorizer 的内存使用量?【英文标题】:How can i reduce memory usage of Scikit-Learn Vectorizers? 【发布时间】:2013-07-06 08:40:17 【问题描述】:

TFIDFVectorizer 占用大量内存,对 470 MB 的 100k 文档进行矢量化需要超过 6 GB,如果我们处理 2100 万个文档,它将无法容纳我们现有的 60 GB RAM。

所以我们选择了 HashingVectorizer,但仍然需要知道如何分发散列矢量化器。Fit 和部分拟合什么都不做,那么如何使用 Huge Corpus?

【问题讨论】:

【参考方案1】:

克服 HashingVectorizer 无法解释 IDF 的一种方法是将您的数据索引到 elasticsearch 或 lucene 并从中检索词向量,您可以使用它们计算 Tf-IDF。

【讨论】:

【参考方案2】:

我强烈建议您在大型数据集上拟合模型时使用HashingVectorizer。

HashingVectorizer 与数据无关,只有来自vectorizer.get_params() 的参数很重要。因此 (un)pickling `HashingVectorizer 实例应该非常快。

基于词汇的矢量化器更适合对小型数据集进行探索性分析。

【讨论】:

很好,我发现了这个:t.co/12cFDYlTil 和测试。我们可以使用无监督学习(KMeans)吗? 在 TFIDFVectorizers 上我们可以使用 Randomized PCA 进行绘图,但是 HashingVectorizer 的输出是不同的,对吧?我们如何在上面做散点图? 为什么会有所不同? RandomizedPCA 可以将任何稀疏矩阵作为输入,无论其生成方式如何。 如果你想做核外无监督学习(集群),你应该使用 MiniBatchKMeans 而不是 KMeans。只有前者有partial_fit 方法。 HashingVectorizer 不进行 IDF 加权。这可能是您的问题的原因。您可以尝试将TfidfTransformer 流水线化以手动对HashingVectorizer 的输出进行IDF 重新加权。

以上是关于如何减少 Scikit-Learn Vectorizer 的内存使用量?的主要内容,如果未能解决你的问题,请参考以下文章

调整 leaf_size 以减少 Scikit-Learn KNN 中的时间消耗

使用 scikit-learn 并行生成随机森林

干货:结合Scikit-learn介绍几种常用的特征选择方法

结合Scikit-learn介绍几种常用的特征选择方法

将 scikit-learn 详细日志写入外部文件

Scikit-learn RandomForestClassifier() 特征选择,只选择训练集?