了解scikit CountVectorizer中的min_df和max_df参数

123

我有五个文本文件输入到CountVectorizer中。在指定CountVectorizer实例的min_dfmax_df时,最小/最大文档频率是什么意思?它是单词在其特定文本文件中的频率还是在整个语料库(五个文本文件)中的频率?

当提供整数或浮点数作为min_dfmax_df时有什么区别?

文档似乎没有提供详细的解释,也没有提供演示这两个参数用法的示例。是否可以提供一个解释或演示min_dfmax_df的示例呢?

6个回答

350

max_df被用于删除出现过于频繁的术语,也称为“特定语料库停用词”。例如:

  • max_df = 0.50表示“忽略在50%以上的文档中出现的术语”。
  • max_df = 25表示“忽略在25个文档以上中出现的术语”。

默认值为1.0,意味着“忽略出现在100%以上的文档中的术语”。因此,默认设置不会忽略任何术语。


min_df被用于删除出现过于稀少的术语。例如:

  • min_df = 0.01表示“忽略在少于1%的文档中出现的术语”。
  • min_df = 5表示“忽略在少于5个文档中出现的术语”。

默认值为1,意味着“忽略出现在少于1个文档中的术语”。因此,默认设置不会忽略任何术语。


10
希望这个内容出现在官方文档中,以避免很多不清楚和混淆。 - lgc_ustc

17
我还想补充一点,以更好地理解tf-idf中的min_df和max_df。
如果您使用默认值,也就是考虑所有术语,那么您生成的标记肯定会更多。因此,您的聚类过程(或者您稍后要对这些术语做的任何其他事情)将需要更长的时间。
但是,您的聚类质量不应该降低。
有人可能认为允许所有术语(例如太频繁的术语或停用词)存在可能会降低质量,但在tf-idf中并不是这样的。因为tf-idf度量本能上会给这些术语一个低得分,从而使它们不具有影响力(因为它们在许多文档中出现)。
因此,总结一下,通过min_df和max_df修剪术语是为了提高性能,而不是聚类的质量(作为示例)。
关键点在于,如果您设置min和max错误,您将丢失一些重要的术语,从而降低质量。因此,如果您不确定正确的阈值(它取决于您的文档集),或者您确定您的机器的处理能力,请不要更改min,max参数。

3
谢谢 - 这是我独立得出的相同结论。 - Isopycnal Oscillation

13
根据 CountVectorizer 文档这里的说明:
当使用范围在 [0.0, 1.0] 的浮点数时,它们指的是文档频率。即包含该项的文件百分比。
当使用整数时,它指的是持有该项的绝对文件数量。
假设你有5个文本文件(或文档)。如果你设置max_df = 0.6,那将转化为0.6*5=3个文档。如果你设置max_df = 2,那就是2个文档。
下面的源代码示例来自于Github这里,显示了如何从max_df中构建max_doc_countmin_df 的代码类似且可以在GH页面上找到。
max_doc_count = (max_df
                 if isinstance(max_df, numbers.Integral)
                 else max_df * n_doc)
min_dfmax_df 的默认值分别为1和1.0。这基本上意味着"如果我的词语只出现在一个文档中,则会被忽略。同样,如果它在所有文档中都出现(100%或1.0),则也会被忽略"max_dfmin_df 都在内部用于计算max_doc_countmin_doc_count,即每个术语必须在其中找到的最大和最小文档数。然后将此传递给self._limit_features作为关键字参数highlowself._limit_features的docstring如下:
"""Remove too rare or too common features.

Prune features that are non zero in more samples than high or less
documents than low, modifying the vocabulary, and restricting it to
at most the limit most frequent.

This does not prune samples with zero features.
"""

7
这很令人困惑。min_df的文档说“忽略文档频率严格低于给定阈值的项”,因此如果频率严格低于默认值1,则意味着忽略从未出现过的项,但保留出现一次的项。 - Monica Heddneck
1
@MonicaHeddneck是正确的。这个答案误解了min_dfmax_df的确切含义。我添加了一个答案,详细解释了CountVectorizer如何解释这些参数。 - Kevin Markham
是的,正如@MonicaHeddneck和kevin指出的那样,这个答案在min_df和max_df方面有些错误。 - jeremy_rutman

5
min_df和max_df的默认值分别为1和1.0。这些默认值实际上并没有什么作用。
话虽如此,我认为目前被接受的答案@Ffisegydd并不完全正确。
例如,使用默认值运行此代码,可以看到当min_df=1且max_df=1.0时,会使用:
1)在至少一个文档中出现的所有标记(例如,所有标记!)
2)在所有文档中出现的所有标记(我们将测试一个候选人:everywhere)。
cv = CountVectorizer(min_df=1, max_df=1.0, lowercase=True) 
# here is just a simple list of 3 documents.
corpus = ['one two three everywhere', 'four five six everywhere', 'seven eight nine everywhere']
# below we call fit_transform on the corpus and get the feature names.
X = cv.fit_transform(corpus)
vocab = cv.get_feature_names()
print vocab
print X.toarray()
print cv.stop_words_

我们得到:
[u'eight', u'everywhere', u'five', u'four', u'nine', u'one', u'seven', u'six', u'three', u'two']
[[0 1 0 0 0 1 0 0 1 1]
 [0 1 1 1 0 0 0 1 0 0]
 [1 1 0 0 1 0 1 0 0 0]]
set([])

所有标记都被保留。没有停用词。

更进一步地调整参数将阐明其他配置。

为了有趣和洞察力,我还建议尝试使用 stop_words = 'english' 并注意到奇怪的是,除了“seven”以外的所有单词都被删除了! 包括 `everywhere'。


2
MIN_DF的目标是忽略出现次数很少的单词,以便被认为具有意义。例如,在您的文本中,可能会出现仅在1或2个文档中出现的人名。在某些应用程序中,这可能被视为噪音,并且可以从进一步分析中消除。类似地,您可以使用MAX_DF忽略太常见的单词。 MIN_DFMAX_DF不是使用最小/最大出现频率(单词的总出现次数)来消除单词,而是查看包含术语的文档数量,更好地称为文档频率。阈值可以是绝对值(例如1、2、3、4)或表示文件比例的值(例如0.25,表示忽略已出现在25%的文件中的单词)。
请参见此处的一些使用示例

0

我刚刚查看了sklearn CountVectorizer的文档,这是我的理解。

常见单词具有较高的频率值,而罕见单词具有较低的频率值。频率值在0-1之间作为分数。

max_df是频率值的上限值,而min_df只是频率值的下限值。

如果我们想要删除更多的常见单词,我们将max_df设置为介于0和1之间的较低上限值。如果我们想要删除更多的罕见单词,我们将min_df设置为介于0和1之间的较高下限值。我们保留max_dfmin_df之间的所有内容。

让我知道,不确定这是否有意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接