【问题标题】:Scikit-Learn Vectorizer `max_features`Scikit-Learn Vectorizer `max_features`
【发布时间】:2018-02-17 12:34:09
【问题描述】:

TfidfVectorizer模块中max_features参数的编号如何选择?我应该使用数据中的最大元素数吗?

参数的description 并没有让我清楚地知道如何为其选择值:

max_features : int 或 None,默认=None

如果不是 None,则构建一个仅考虑按语料库中的词频排序的最高 max_features 的词汇表。 如果词汇表不是 None,则忽略此参数。

【问题讨论】:

  • 不太清楚你在问我什么。如果您没有特定理由来限制元素数量,请不要指定它,它将默认为数据集中的最大元素数量。

标签: scikit-learn


【解决方案1】:

此参数是绝对可选的,应根据理性思维和数据结构进行校准。

有时转换整个词汇表是无效的,因为数据可能包含一些非常罕见的单词,如果将其传递给TfidfVectorizer().fit(),将来会在输入中添加不需要的维度。例如,在这种情况下,一种适当的技术是打印出文档中的单词频率,然后为它们设置一定的阈值。假设您设置了 50 个阈值,并且您的数据语料库包含 100 个单词。查看单词频率后,20 个单词出现不到 50 次。因此,您设置了max_features=80,您就可以开始了。

如果max_features 设置为None,则在TF-IDF 转换过程中会考虑整个语料库。否则,如果您将 5 传递给 max_features,这将意味着从文本文档中最常见的 5 个单词中创建一个特征矩阵。


快速示例

假设您使用与硬件相关的文档。您的原始数据如下:

from sklearn.feature_extraction.text import TfidfVectorizer

data = ['gpu processor cpu performance',
        'gpu performance ram computer',
        'cpu computer ram processor jeans']

您在第三个文档中看到单词jeans 几乎不相关,并且在整个数据集中仅出现一次。省略这个词的最好方法当然是使用stop_words 参数,但想象一下如果有很多这样的词;或与主题相关但很少出现的单词。在第二种情况下,max_features 参数可能会有所帮助。如果您继续使用max_features=None,那么它将创建一个 3x7 稀疏矩阵,而最好的情况是 3x6 矩阵:

tf = TfidfVectorizer(max_features=None).fit(data)
tf.vocabulary_.__len__()  # returns 7 as we passed 7 words
tf.fit_transform(data)  # returns 3x7 sparse matrix

tf = TfidfVectorizer(max_features=6).fit(data)  # excluding 'jeans'
tf.vocabulary_  # prints out every words except 'jeans'
tf.vocabulary_.__len__()  # returns 6
tf.fit_transform(data)  # returns 3x6 sparse matrix

【讨论】:

  • 但在这种情况下,这是否会消除寻找牛仔裤等“异常值”的可能性?
  • 是的。不过,模型不应该担心这样的异常值,因为示例文本根本不是关于衣服的。使用 max_featuresstop_words 有助于它专注于真正可行的事情。
猜你喜欢
  • 2019-01-23
  • 2013-07-06
  • 2020-11-05
  • 2016-08-26
  • 2018-01-23
  • 2013-08-20
  • 2016-04-11
  • 2018-10-08
  • 2012-10-27
相关资源
最近更新 更多