Scikit learn 在python中使用HashingVectorizer时如何获取功能名称?

Scikit learn 在python中使用HashingVectorizer时如何获取功能名称?,scikit-learn,feature-extraction,Scikit Learn,Feature Extraction,我想制作一个2D二进制数组(n_样本,n_特征),其中每个样本是一个文本字符串,每个特征是一个单词(unigram) 问题是样本数量是350000,功能数量是40000,但我的RAM大小只有4GB 我在使用CountVectorizer后出现内存错误。那么,有没有其他方法(如迷你批量)来实现这一点 如果我使用HashingVectorizer,那么如何获取功能名称?i、 e.哪个列对应于哪个功能?,因为get_feature_names()方法在HashingVectorizer中不可用 小批量

我想制作一个2D二进制数组(n_样本,n_特征),其中每个样本是一个文本字符串,每个特征是一个单词(unigram)

问题是样本数量是350000,功能数量是40000,但我的RAM大小只有4GB

  • 我在使用CountVectorizer后出现内存错误。那么,有没有其他方法(如迷你批量)来实现这一点

  • 如果我使用HashingVectorizer,那么如何获取功能名称?i、 e.哪个列对应于哪个功能?,因为get_feature_names()方法在HashingVectorizer中不可用

  • 小批量不支持在countvectorizer中。但是,sklearn的哈希向量器有
    partial_fit()
    可供使用

  • 引用sklearn文档“无法计算逆变换(从特征索引到字符串特征名称),这可能是在尝试反思哪些特征对模型最重要时出现的问题。”


  • 要获取HashingVectorizer的功能名称,您可以随机抽取文档样本,计算它们的哈希值,并通过这种方式了解哪个哈希值对应于哪个标记。它并不完美,因为可能存在与给定列相对应的其他标记,并且可能存在冲突,但这通常足以检查矢量化结果(或例如,使用散列特征的线性分类器的系数)

    一个无耻的插件包实现了这一点:

    from eli5.sklearn import InvertableHashingVectorizer
    
    # vec should be a HashingVectorizer instance
    ivec = InvertableHashingVectorizer(vec) 
    ivec.fit(docs_sample)  # e.g. each 10-th or 100-th document
    names = ivec.get_feature_names()
    
    另请参见eli5文档中的:部分。

    的目的是在不存储特征名称的情况下获得合理的文本矢量表示。